首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

哈希表及处理冲突的方法(2)

哈希表及处理冲突的方法(2)

8.4.1   哈希函数的构造方法    构造哈希函数的原则是:函数本身便于计算;计算出来的地址分布均匀,即对任一关键字kf(k) 对应不同地址的概率相等,目的是尽可能减少冲突。
下面介绍构造哈希函数常用的五种方法。
1 数字分析法
      如果事先知道关键字集合,并且每个关键字的位数比哈希表的地址码位数多时,可以从关键字中选出分布较均匀的若干位,构成哈希地址。例如,有80个记录,关键字为8位十进制整数d1d2d3…d7d8,如哈希表长取100,则哈希表的地址空间为:00~99。假设经过分析,各关键字中 d4d7的取值分布较均匀,则哈希函数为:h(key)=h(d1d2d3…d7d8)=d4d7。例如,h(81346532)=43h(81301367)=06。相反,假设经过分析,各关键字中 d1d8的取值分布极不均匀, d1 都等于5d8 都等于2,此时,如果哈希函数为:h(key)=h(d1d2d3…d7d8)=d1d8,则所有关键字的地址码都是52,显然不可取。
2 平方取中法
当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。
例:我们把英文字母在字母表中的位置序号作为该英文字母的内部编码。例如K的内部编码为11E的内部编码为05Y的内部编码为25A的内部编码为01,B的内部编码为02。由此组成关键字“KEYA”的内部代码为11052501,同理我们可以得到关键字“KYAB”、“AKEY”、“BKEY”的内部编码。之后对关键字进行平方运算后,取出第7到第9位作为该关键字哈希地址,如图8.23所示。


关键字

内部编码

内部编码的平方值

H(k)关键字的哈希地址

KEYA

11050201

122157778355001

778

KYAB

11250102

126564795010404

795

AKEY

01110525

001233265775625

265

BKEY

02110525

004454315775625

315

8.23平方取中法求得的哈希地址

3 分段叠加法
      这种方法是按哈希表地址位数将关键字分成位数相等的几部分(最后一部分可以较短),然后将这几部分相加,舍弃最高进位后的结果就是该关键字的哈希地址。具体方法有折叠法移位法。移位法是将分割后的每部分低位对齐相加,折叠法是从一端向另一端沿分割界来回折叠(奇数段为正序,偶数段为倒序),然后将各段相加。例如:key=12360324711202065,哈希表长度为1000,则应把关键字分成3位一段,在此舍去最低的两位65,分别进行移位叠加和折叠叠加,求得哈希地址为105907,如图8.24所示。


1  2  3                   1  2   3
6  0  3                   3  0   6
2  4  7                   2  4   7
1  1  2                   2  1   1
+  0  2  0              + 0  2   0
        ————————            —————————
       1  1  0  5                   9  0   7

a)移位叠加                   (b) 折叠叠加

                      8.24 由叠加法求哈希地址

4 除留余数法
假设哈希表长为mp为小于等于m的最大素数,则哈希函数为
hk=k %  p ,其中%为模p取余运算。
例如,已知待散列元素为(18756043549046),表长m=10p=7,则有
   h(18)=18 %7=4    h(75)=75% 7=5   h(60)=60 %7=4   
   h(43)=43 %7=1    h(54)=54% 7=5   h(90)=90 %7=6   
   h(46)=46 % 7=4
此时冲突较多。为减少冲突,可取较大的m值和p值,如m=p=13,结果如下:
   h(18)=18 %13=5    h(75)=75% 13=10   h(60)=60 % 13=8   
   h(43)=43 %13=4    h(54)=54% 13=2   h(90)=90 %13=12   
   h(46)=46 % 13=7
此时没有冲突,如图8.25所示。

0     1     2    3    4    5     6    7    8    9    10    11   12

54

43

18

46

60

75

90

                      8.25  除留余数法求哈希地址
继承事业,薪火相传
返回列表