使用哈希表技术判别两个源程序的相似性

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用哈希表技术判别两个源程序的相似性

[咨询题描述]

关于两个C语言的源程序清单,用哈希表的方法分不统计两程序中使用C语言关键字的情形,并最终按定量的运算结果,得出两份源程序清单的相似性。

[差不多要求]

C语言关键字的哈希表自建,此题的工作只要是扫描给定的源程序,累计在每个源程序中C语言关键字显现的频度。在扫描源程序过程中,每遇到关键字就查找哈希表,并累加相应关键字显现的频度。为保证查找效率,建议自建哈希表的平均查找长度ASL不大于2。

扫描两个源程序所统计的所有关键字不同频度,能够得到两个向量。如下面简单的例子所示:

关键字

程序1种关键字频度

程序2中关键字频度

哈希地址

X1=[4,3,0,4,3,0,7,0,0,2] X2=[4,2,0,5,4,0,5,2,0,1]

通过运算向量X1和X2的相对距离来判定两个源程序的相似性,相对距离的运算方法是

按例子所给数据,S≈0.13。明显当X1=X2时,S=0,反映出可能是同一个程序;S值越大,则两个程序的差不可能也越大。

[测试数据]

作几个编译和运行都无误的C程序,程序之间有相近的和差不大的,用上述方法求S,并对比差异程度。

[实现提示]

本题的专门大工作量将是对源程序扫描,区分出C程序的每一关键字。能够为C语言关键字建一棵键树,扫描源程序和在键树种查找同步进行,也取得每一个关键字。

[咨询题讨论]

这种判定方法只是提供一种辅助手段,即便S=0也可能不是同一程序,S的值专门大,也可能算法完全是一样的。例如,一个程序使用while语句,另一个使用for 语句,但功能完全相同。事实上,当发觉s的值专门小时,就应该以人工干预来区分。

Void int for char if else While

4 3 4 3 7 0 2

4 2

5 4 5 2 1

相关文档
最新文档