- 1、本文档共33页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
现在要储存和使用下面的线性表: A: (1,75,324,43,1353,90,46). 我们可以定义一维数组 a:array[1..n] of longint; 我们需要用O(n)的时间来查找某个元素 也可以定义a:array[1..1353] of longint 使a[key]:=key; 也就是我们所学过的桶排序; 这样时间效率会变成O(1) 一次查找 VS 多次查找(找K次) O(K*n) O(K) 桶排的弊端 A:(18,75,60,43,54,90,46) C=2(负的也可以) m[20]:=18 m[77]:=75 m[62]:=60 m[45]:=43 m[56]:=54 m[92]:=90 m[48]:=46 C=0时 1、直接定址法 以关键字Key 本身或关键字加上某个数值常量C 作为散列地址的方法。散列函数为:h(Key)=Key+C,若C 为0,则散列地址就是关键字本身。 2、除余法 选择一个适当的正整数m,用m 去除关键码,取其余数作为地址,即:h(Key)= Key mod m, 这个方法应用的最多,其关键是m 的选取,一般选m 为小于某个区域长度n 的最大素数(如例1 中 取m=13),为什么呢?就是为了尽力避免冲突。假设取m=1000 ,则哈希函数分类的标准实际上就 变成了按照关键字末三位数分类,这样最多1000 类,冲突会很多。一般地说,如果 m 的约数越 多,那么冲突的几率就越大。 简单的证明:假设m 是一个有较多约数的数,同时在数据中存在q 满足gcd(m,q)=d 1 ,即 有m=a*d,q=b*d,则有以下等式:q mod m= q – m* [q div m] =q – m*[b div a] 。 其中,[b div a]的取值范围是不会超过[0,b]的正整数。也就是说,[b div a]的值只有b+1 种可 能,而m 是一个预先确定的数。因此上式的值就只有b+1 种可能了。这样,虽然mod 运算之后 的余数仍然在[0,m-1]内,但是它的取值仅限于等式可能取到的那些值。也就是说余数的分布变得 不均匀了。容易看出,m 的约数越多,发生这种余数分布不均匀的情况就越频繁,冲突的几率越 高。而素数的约数是最少的,因此我们选用大素数。记住“素数是我们的得力助手” 3、数字分析法 常有这样的情况:关键码的位数比存储区域的地址的位数多,在这种情况下可以对关键码的 各位进行分析,丢掉分布不均匀的位留下分布均匀的位作为地址。 本方法适用于所有关键字已知,并对关键字中每一位的取值分布情况作出了分析。 【例2】对下列关键码集合(表中左边一列)进行关键码到地址的转换,要求用三位地址。 Key H(Key) 000319426 326 000718309 709 000629443 643 000758615 715 000919697 997 000310329 329 分析: 关键码是9 位的,地址是3 位的,需要经过数字分析丢掉6 位。丢掉哪6 位呢?显然前3 位 是没有任何区分度,第5 位1 太多、第6 位基本都是8 和9、第7 位都是3、4、5,这几位的区分 度都不好,而相对来说,第4、8、9 位分布比较均匀,所以留下这3 位作为地址(表中右边一列)。 4、平方取中法 将关键码的值平方,然后取中间的几位作为散列地址。具体取多少位视实际要求而定,取哪 几位常常结合数字分析法。 【例3】将一组关键字(0100,0110,1010,1001,0111)平方后得(0010000,0012100,1020100, 1002001,0012321),若取表长为1000,则可取中间的三位数作为散列地址集: (100,121,201,020,123)。 5、折叠法 如果关键码的位数比地址码的位数多,而且各位分布较均匀,不适于用数字分析法丢掉某些 数位,那么可以考虑用折叠法。折叠法是将关键码从某些地方断开,分关键码为几个部分,其中 有一部分的长度等于地址码的长度,然后将其余部分加到它的上面,如果最高位有进位,则把进 位丢掉。 一般是先将关键字分割成位数相同的几段(最后一段的位数可少一些),段的位数取决于散列 地址的位数,由实际需要而定,然后将它们的对应位叠加和(舍去最高位进位)作为散列地址。 【例4】如关键码Key要求转换为3 位的地址码。 分析:分如下3 段:5 8 4 | 2 2 2 | 4 1,则相加: 5 8 4 2 2 2 4 1 _______ 8 4 7 h(Key)=847 54 43 18 46 60 75 90 5 A:(18,75,60,43,54,90,46,5) 46 90 18 15 75 43 60 5 15 -1 -1 1
文档评论(0)