- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、 问题描述
1. 实验题目:利用哈希表统计两源程序的相似性
2. 基本要求:
1)内容: 对于两个 C 语言的源程序清单,用哈希表的方法分别统计两程序中使用C语言关键字的情况,并最终按定量的计算结果,得出两份源程序的相似性。
2)要求与提示:
C 语言关键字的哈希表可以自建,也可以采用下面的哈希函数作为参考:
Hash(key)=(key第一个字符序号*100+key最后一个字符序号)%41
表长m取43。此题的工作主要是扫描给定的源程序,累计在每个源程序中C语言关键字出现的频度。为保证查找效率,建议自建哈希表的平均查找长度不大于2。 扫描两个源程序所统计的所有关键字不同频度, 可以得到两个向量。如下面简单的例子所示:
关键字
void
int
for
char
if
else
while
程序1中
关键字频度
4
3
4
3
7
0
2
程序2中
关键字频度
4
2
5
4
5
2
1
哈希地址
0
1
2
3
4
5
6
7
8
9
根据程序1和程序2中关键字出现的频度,可提取到两个程序的特征向量X1和X2,其中 X1=(4 3 0 4 3 0 7 0 0 2)T
X2=(4 2 0 5 4 0 5 2 0 1)T
一般情况下,可以通过计算向量Xi和Xj的相似值来判断对应两个程序的相似性,相似值的判别函数计算公式为:
其中,。S(Xi,Xj)的值介于[0,1]之间,也称广义余弦,即S(Xi,Xj)=COSθ。Xi=Xj 时,显见S(Xi,Xj)=1,θ=0;XiXj 差别很大时,S(Xi,Xj)接近0,θ接近π/2。如X1=(1 0)T,X2=(0 1)T,则S(Xi,Xj)=0,θ=π/2。当S值接近1 的时候,为避免误判相似性(可能是夹角很小,模值很大的向量),应当再次计算之间的“几何距离” D(Xi,Xk)。其计算公式为:
最后的相似性判别计算可分两步完成:
第一步 用式(3-1)计算S,把接近 1的保留,抛弃接近0的情况(把不相似的排除);
第二步 对保留下来的特征向量,再用式(3-2)计算D,如D值也比较小,说明两者对应的程序确实可能相似(慎重肯定相似的)。
S和D的值达到什么门限才能决定取舍?需要积累经验,选择合适的阈值。
3) 测试数据:
做几个编译和运行都无误的C程序,程序之间有相近的和差别大的,用上述方
法求S,并对比差异程度。
二、 需求分析
1.本程序能够打印根据关键字建立的哈希表及利用该表统计的C语言源程序关键字使用情况,得出源程序的相似性。
2.将关键字输入key.txt中,关键字均为char型,以空格分开,将要比较的源程序存入不同文本文档中,运行时按提示输入源程序个数和相应的文档名称,若输入多个源程序,比较时输入相应的源程序序号(序号为输入源程序的顺序)。
3.输出建立的哈希表,按哈希表统计的源程序关键字使用情况,所比较的两个程序间的相似度以及向量的几何距离。
三、 概要设计
为了实现上述功能,需要哈希表抽象数据类型。
哈希表抽象数据类型定义:
ADT HashList{
数据对象:D是相同类型元素构成的结合。
数据关系:R={集合内的元素之间是松散关系}
基本操作:
int Dimension(LinkHashList HT);//求哈希表元素总个数
int HashFunc(char *e); //哈希函数
void InitHashList(LinkHashList HT,int m,FILE *fp); //创建哈希表
void InsertHT(LinkHashList HT,char *e);//插入元素
LNode * SearchHT(LinkHashList HT,char *e);//查找元素
void HashBuild(FILE *fp,LinkHashList HT);//统计源程序每个关键字频度
void Hashclear(LinkHashList HT,int m);//将哈希表每个关键字频度置零
void TraverseHT(LinkHashList HT); //输出哈希表
} ADT HashList
5.本程序保护模块:
主程序模块
哈希表单元模块:实现哈希表抽象数据类型
调用关系:
主程序模块-哈希表单元模块
四、 详细设计
1.结点类型和结点指针类型:
typedef struct LNode{
char data[10];
int account;
struct LNode *next;
}LNode,**ppLNode;
typedef struct{
ppLNode head;
int length;
}LinkHashList;
文档评论(0)