第三章3.1哈希表介绍.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 查找与排序技术 什么是哈希表 Hash表技术的关键是要处理好表中元素的冲突问题,它主要包括以下两方面的工作: ①构造合适的Hash码,以便尽量减少表中元素冲突的次数,即Hash码的均匀性要比较好。 ②当表中元素发生冲突时,要进行适当的处理。 Hash码的构造 Hash表技术的主要目标是提高查找效率,即缩短查表的时间。 ⑴截断法。是指选取与关键字对应的数字串中的一段(一般选取低位数)作为该关键字的Hash码。 ⑵分段叠加法。将关键字的编码串分割成若干段,然后把他们叠加后再进行截段。 ⑶除法。将关键字的编码除以表的长度,最后所得的余数作为Hash码,即取Hash码为i=mod(k,n)(当mod(k,n)0时,取i=n) 本方法构造的Hash码,其均匀性比较好,但是以一次除法为代价,在除法较快的机器上可以采用。 ⑷乘法。将关键字编码与一个常数 相乘后,再除以表长度n,取其余数作为Hash码 线性Hash表是一种最简单的Hash表。 ⑴设线性表的长度为n,则将关键字k及有关信息填入线性Hash表的步骤如下: ①计算关键字k的Hash码i=i(k). ②检查表中第i项的内容: 若第i项为空,则将关键字k及有关信息填入该项; 若第i项不空,则令i=mod(i+1,n),转②继续检查。 ⑵线性Hash表的取出 ①计算关键字k的Hash码i=i(k). ②检查表中第i项的内容: 若第i项登记着关键字k,则取出该项元素即可; 若第i项为空,则表示在Hash表中没有该关键字的信息; 若第i项不空,且登记的不是关键字k,则令i=mod(i+1,n),转②继续检查。 线性表的优缺点: 优点:简单 缺点:①在线性Hash表填入的过程中,当发生冲突时,首先考虑的是下一项,因此,当Hash码的冲突较多时,在线性Hash表中会存在“堆聚”现象,即许多关键字被连续登记在一起,从而会降低查找效率。 ②在线性Hash表的填入过程中,处理冲突时会带来新的冲突,即线性Hash表的填入方法是不顾后效的。 2.随机Hash表 当Hash表的长度n设计成n=2m时,还可以定义另外一种Hash表——随机Hash表。随机Hash表与线性Hash表的不同之处在于:一旦发生元素冲突时,表项序号i的改变不是采用加1取模的方法,而是用某种伪随机数来改变。 ⑴随机Hash表的填入: ①计算关键字k的Hash码i0=i(k),且令i=i0. ②伪随机数序列初始化,令j=1(将随机数指针指向伪随机数序列的第1个随机数) ③检查表中第i项的内容: 若第i项为空,则将关键字k及有关信息填入该项; 若第i项不空,则令i=mod(i0+RN(j),n),并令j=j+1(将随机数指针指向下一个随机数),转③继续检查。 ⑵随机Hash表的取出: ①计算关键字k的Hash码i0=i(k),且令i=i0 ②伪随机数序列初始化,令j=1(将随机数指针指向伪随机数序列的第1个随机数)。 ③检查表中第i项的内容: 若第i项登记着关键字k,则取出该项元素即可; 若第i项为空,则表示在Hash表中没有该关键字的信息; 若第i项不空,且登记的不是关键字k,则令i=mod(i0+RN(j),n),并令j=j+1(将随机数指针指向下一个随机数),转③继续检查。其中RN(j)表示伪随机数序列RN中的第j个随机数。 3.溢出Hash表 线性Hash表与随机Hash表均存在两个致命的缺点:一是在Hash表填入过程中不顾后效,从而在填入过程中其冲突的机会在不断增多;二是当Hash表填满时,不能正常地进行查找。如果将冲突的元素安排在另外的空间内,而不占用Hash表本身的空间,则不会产生新的冲突,这就是溢出Hash表。 溢出Hash表包括Hash表和溢出表两部分。在Hash表的填入过程中,将冲突的元素顺序填入溢出表,而当查找过程中发现冲突时,就在溢出表中进行顺序查找。 溢出表的填入过程: ①计算关键字k的Hash码i=i(k). ②检查表中第i项的内容: 若第i项为空,则将关键字K及有关信息填入该项; 若第i项不空,则将关键字k及有关信息依次填入溢出表中的自由项。 ⑵溢出Hash表的取出: ①计算关键字k的Hash码i=i(k). ②检查表中第i项内容: 若第i项登记着关键字k,则取出该项元素即可; 若第i项为空,则表示在Hash表中没有该关键字的信息; 若第i项不空,且登记的不是关键字k,则转入在溢出表中进行顺序查找。 4.拉链Hash表-1 拉链Hash表分为外链Hash表与内链Hash表。我们只讨论外链Hash表。 外链Hash表由Hash表及表外结点所组成。在Hash表中登记的并不是关键字k及有关信息,而只是登记指针。 4.拉链Hash表-2 ⑴外链Hash表的填入

文档评论(0)

5201394 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档