哈希实验报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

小教资源库 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档