哈希表的设计与运用.docVIP

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

目 录 第1章 需求分析 …………………………………………………… 第2章 概要设计 …………………………………………………… 第3章 详细设计 …………………………………………………… 第4章 调试分析…………………………………….......................... 第5章 核心源程序清单和执行结果…………………………….... 第6章 设计体会…………………………………………................. 第7章 附录…………………………………………………........... 需求分析 1.问题描述:针对某个集体(比如你所在的班级)中的人名设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序; 2.人名为中国人姓名的汉语拼音,人名有30个,平均查找长度的上限为2; 3.用伪随机探测再散列法处理冲突; 4.输入为所要查询的人姓名(拼音);输出为该关键字的查找信息; 5.测试数据: 输入:lihaojie 输出:姓名:lihaojie 关键字:837 查找长度:1 输入:wangzhou 输出:姓名:wangzhou 关键字: 查找长度:3 输入:d 输出:显示哈希表 6.本程序用C++语言编写,在vc++6.0环境下运行。 概要设计 2.1算法思想: 1 定义: 哈希表是为了便于快速搜索而组织的键/值组合的集合。Hash Table是一种数组,可以用任意简单变量值来访问其元素,这种数组叫哈希表。 2 优点: 哈希表最大的优点就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。 3 基本原理: 使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)存在一一对应的关系,于是用这个数组单元来存储这个元素。也可以简单的理解为,按照关键字为每一个元素“分类”。 4哈希表的不可避免冲突(collision)现象: 对不同的关键字可能得到同一个哈希地址 即key1≠key2,而f(key1)=f(key2)。因此,在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。用伪随机探测法。求下一个开放地址的公式为:Hi = (H(k)+di) MOD m 注意:Di=伪随机数序列; 2.2关于程序设计的基本操作: 1.对哈希表的操作 InitNameList() 操作结果:姓名(结构体数组)初始化 CreateHashList() 操作结果:建立哈希表 FindList() 操作结果:在哈希表中查找 Display() 操作结果:显示哈希表 2.主程序 int main() { 初始化; InitNameList(); CreateHashList(); do { 接受命令; 处理命令; }while(“命令”=“退出”); return 0; } 3.本程序包含的模块 } 1)初始化操作,结构体定义; 2)姓名结构体建立模块; 3)建立哈希表模块; 4)查找模块; 5)显示哈希表模块; 4)主程序模块 4 程序流程图 详细设计 主要功能模块 模块一:建立哈希表 void CreateHashList() //建立哈希表 { int i; for(i=0; iHASH_LENGTH;i++) { HashList[i].py=; HashList[i].k=0; HashList[i].si=0; } for(i=0;iHASH_LENGTH;i++) { int sum=0; int adr=(NameList[i].k)%M; //哈希函数 int d=adr; if(HashList[adr].si==0) //如果不冲突 { HashList[adr].k=NameList[i].k; HashList[adr].py=NameList[i].py; HashList[adr].si=1; } else //冲突 { do { d=(d+NameList[i].k%10+1)%M; //伪随机探测再散列法处理冲突

文档评论(0)

wannian118 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档