哈希表的概念
哈希表(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为表长。
网友评论