求高手解答 求代码 。。使用哈希表技术判别两个源程序的相似性

bingyi7987 2012-12-05 05:36:11
[问题描述]
对于两个C语言的源程序清单,用哈希表的方法分别统计两个程序中使用C语言关键字的情况,并最终按定量的计算结果,得出两份源程序清单的相似性。
[基本要求]
C语言关键字的哈希表可以自建,也可以利用《数据结构及应用算法教程》(严蔚敏 陈文博编著 清华大学出版社)书中8。10的哈希表。此题的工作主要是扫描给定的源程序,累计在每个源程序中C语言关键字出现的频度。在扫描源程序过程中,每遇到关键字就查找哈希表,并累加相应关键字出现的频度。为保证查找效率,建议自建哈希表的平均查找长度ASL不大于2。
扫描两个源程序所统计的所有关键字不同频度,可以得到两个向量。如下面简单的例子所示:
Void Int For Char If Else while
4 3 4 3 7 0 2
4 2 5 4 5 2 1
关键字
程序1种关键字频度
程序2种关键字频度
哈希地址 0 1 2 3 4 5 6 7 8 9

X1=[4,3,0,4,3,0,7,0,0,2] X2=[4,2,0,5,4,0,5,2,0,1]
通过计算向量X1和X2的相对距离来判断两个源程序的相似性,相对距离的计算方法是
,T表示向量的转置。
按例子所给的数据,s 0.13。显然当X1=X2时,s=0,反映出可能是同一个程序;s值越大,则两个程序的差别可能也越大。
[测试数据]
做几个编译和运行都无误的C程序,程序之间有相近的和差别大的,用上述方法求s,并对比差异程度。
[实现提示]
本题的很大工作量将是对源程序扫描,区分出C程序的每一关键字。可以为C语言关键字集建一棵键树,扫描源程序和在键树中查找同步进行,以取得每一个关键字。
[问题讨论]
这种判断方法只是提供一种辅助手段,即便s=0也可能不是同一个程序,s的值很大,也可能算法是完全一样的。例如,一个程序使用while语句,另一个使用for语句,但功能完全相同。事实上,当发现s的值很小时,就应该以人工干预来区分。
...全文
343 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfdscx 2013-03-04
  • 打赏
  • 举报
回复
这是作业么
东方叔叔 2013-03-03
  • 打赏
  • 举报
回复
哎 copy?

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧