- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章 哈希表 《数据结构(C#语言描述)》配套PPT 北京大学出版社 制作:陈广 博客: 引入 在C#的万物之母object对象中定义了一个虚方法GetHashCode(),这个方法用于获取对象的哈希码。什么是哈希码?它有什么作用?为什么要在如此重要的类中定义这个方法?哈希码跟哈希表有什么内在的联系吗?本章将对这些问题展开论述。。 8.1 概念引入 【例8-1 Demo8-1.cs】使用学号查找学生地址 【例8-2 Demo8-2.cs】哈希查找 8.2 构造哈希函数的方法 构造哈希函数的目标是使哈希地址尽可能均匀地分布在连续的内存单元地址上,以减少冲突发生的可能性,同时使计算尽可能简单以达到尽可能高的时间效率。根据关键字的结构和分布不同,可构造出与之适应的各不相同的哈希函数。这里主要讨论几种常用的整数类型关键字的哈希函数构造方法。 8.2 构造哈希函数的方法 直接定址法取关键字或关键字的某个线性函数为哈希地址。即: h(key) = key 或 h(key) = a * key + b 其中a、b为常数,调整a与b的值可以使哈希地址取值范围与存储空间范围一致。这种哈希函数计算简单,并且不会有冲突发生。它适合于关键字的分布基本连续的情况,若关键字分布不连续,将造成存储空间的大量浪费。 8.2 构造哈希函数的方法 该方法是提取关键字中随机性较好的数字位,然后把这些数位拼接起来作为哈希地址。它适合于所有关键字值都已知的情况,并需要对关键字中每位的取值分布情况进行分析。 8.2 构造哈希函数的方法 除留余数法采用取模运算(%),把关键字除以某个不大于哈希表表长的整数得到的余数作为哈希地址。哈希函数的形式为: h(key) = key % p 除留余数法的关键是选好p,使得记录集合中的每个关键字通过该孩子数转换后映射到哈希表范围内任意地址上的概率相等,从而尽可能减少发生冲突的可能性。 8.3 哈希冲突解决方法 哈希函数的目标是尽量减少冲突,但实际应用中冲突是无法避免的,所以在冲突发生时,必须有相应的解决方案。而发生冲突的可能性又跟以下两个因素有关: 装填因子α 所采用的哈希函数 8.3 哈希冲突解决方法 冲突解决技术可分为两大类:开散列法(又称为链地址法)和闭散列法(又称为开放地址法)。哈希表是用数组实现的一片连续的地址空间,两种冲突解决技术的区别在于发生冲突的元素是存储在这片数组的空间之外还是空间之内 8.3 哈希冲突解决方法 闭散列法是把所有的元素存储在哈希表数组中。当发生冲突时,在冲突位置的附近寻找可存放记录的空单元。寻找“下一个”空位的过程称为探测。上述方法可用如下公式表示: hi = (h(key) + di) % m 其中 i = 1,2,…,k (k ≤ m - 1) 其中h(key)为哈希函数;m为哈希表长;di为增量的序列。根据di取值的不同,可以分成几种探测方法, 8.3 哈希冲突解决方法 线性探测法的基本思想是:当发生冲突时,从冲突位置的下一个单元顺序寻找,只要找到一个空位,就把元素放入此空位中。顺序查找时,把哈希表看成一个循环表,即如果到最后一个位置也没有找到空位,则回到表头开始继续查找。此时,如果仍然未找到空位,则说明哈希表已满,需要进行溢出处理。 8.3 哈希冲突解决方法 已知一组关键字为(12,19,23,28,39,51,56,76,84),哈希表长m=13,哈希函数为:h(key) = key%11 8.3 哈希冲突解决方法 每个元素经哈希函数计算出来的地址称为基地址,这种不同基地址的元素争夺同一个单元的现象叫做二次聚集。二次聚集实际上是在处理同义词之间的冲突时引发的非同义词的冲突。显然,这种现象对查找不利。线性探测很容易出现二次聚集,小的聚集能汇合成大的聚集,最终导致很长的探测序列,从而降低哈希表的运算效率。 8.3 哈希冲突解决方法 线性探测法的缺点是容易出现二次聚集,为了减少二次聚集的产生,可以加大探测序列的步长,使发生冲突的元素的位置比较分散。如果在地址i产生冲突,不是探测i+1地址,而是探测i + 12,i - 12,i + 22,i - 12,…的地址。该方法的优点是可以减少二聚集的产生,缺点是不易探测到整个哈希空间。 8.3 哈希冲突解决方法 双重散列法又称二度哈希,是闭散列法中较好的一种方法,它是以关键字的另一个散列函数值作为增量。设两个哈希函数为:h1和h2,则得到的探测序列为: (h1(key)+h2(key))%m,(h1(key)+2h2(key))%m,(h1(key)+3h2
您可能关注的文档
最近下载
- 党小组工作职责与相关制度汇编.docx VIP
- 英语丨贵州省贵阳市2024届高三上学期8月摸底考试英语试卷及答案.pdf VIP
- 2025年杭州市房地产市场监测报告.doc VIP
- 仓库管理岗位职责仓库管理岗位职责精选.doc VIP
- TGDICST-粉类防晒化妆品 SPF 值体外测定方法.pdf VIP
- 高处作业施工专项方案.docx VIP
- 政府采购评审专家资格考试题库.doc VIP
- DB4412_T 19-2022 消防车道、救援场地和窗口标识设置规范.docx VIP
- 2025年5月三级人力资源管理师考试《理论知识》真题试卷【完整版】.pdf VIP
- 仓库管理规章制度.pdf VIP
文档评论(0)