算法复习-查找(5)-哈希表

哈希表的概念

哈希表(hash),又称散列表,根据给定的关键字来计算关键字在表中的地址。

常用hash函数的构造方法

1. 直接定址法:
取关键字或关键字的某个线性函数为hash地址,即H(key) = key 或者 H(key) = a*key + b,其中a和b为常数。

2. 数字分析法
假设关键字是r进制数(如十进制数),并且hash表中可能出现的关键字都是事先知道的,则可选取关键字的若干数位组成hash地址。选择的原则是使得到的hash地址尽量减少冲突,即所选数位上的数字尽可能是随机的。

3. 平方取中法
取关键字平方后的中间几位作为hash地址,取的位数由表长决定。

4. 除留余数法:(使用最多)
取关键字被某个不大于hash表表长的数p除后所得的余数为hash地址,即:

H(key) = key mod p ( p <= m)

p的选取很重要,一般选小于或等于表长的最大素数,这样可以减少冲突。

常见的哈希冲突解决方法

1. 开放定址法
主要有两种: 1)线性探查法;2)平方探查法
1)线性探查法:
线性探查法是从发生冲突的地址(设为d)开始,依次探查d的下一个地址(当到达表尾时,从表首地址又开始探查)。其递推公式为:

Hi(k) = (H(k) + i) Mod m (1 <= i <= m-1)

可能产生堆积问题。

2) 平方探查法
平方探查法所得到的新的地址序列为d+1^2, d-1^2, d+2^2, d-2^2...
平方探查法是一种较好的处理冲突的方法,可以减少出现堆积问题。它的缺点是不能探查到hash表上所有单元,但至少能探查到一半的单元。

此外,开放定址法的探查方法还有伪随机序列法以及双hash函数法(双hash 法即hash地址为H(H(k)))。

2. 链地址法
链地址法是把所有相同的同义词用单链表连接起来的方法。在这种方法中,hash表每个单元中存放的不再是记录本身,而是相应同义词单链表的表头指针。

散列表的性能分析:

查找成功时的平均查找长度是指找到表中已有表项的平均比较次数,它是找到表中各个已有表项的平均比较次数。
查找不成功时的平均查找长度是指在表中找不到待查的表项,但找到插入位置的平均比较次数。
hash表的平均查找长度与关键字个数n无关,而与装填因子a有关。a = n/m,n为关键字个数,m为表长。

你可能感兴趣的:(算法复习-查找(5)-哈希表)