哈希处理冲突的方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈希处理冲突的方法
处理哈希冲突的方法
1、线性探测法
概念:一旦发生了哈希冲突,就去寻找下一个空的存储地址,只要哈希表的足够大,总能找到空的存储地址,并存入哈希表中。

其公式可表示为:
fi(key)=(f(key)+di)%m (di=1,2,3,...,m-1)
线性探测法的弊端是:若关键字的位置都聚集在一块儿,就需要不断处理冲突,导致存入效率、查找效率大大降低。

进一步考虑另一种情况,若哈希表的长度为10,对应的下标位置为0~9,假设只有位置5是空的,现在利用除留余数法存入key=16的值,此时 f(key)=16%10=6,由此调用公式
fi(key)=(6+di)%10 (di=1,2,3,…,9)找到空位置,我们发现要调用9次才能找到空位置5,可见效率极低。

2、二次探测法
考虑线性探测方法的弊端,可以改进 di=12,-12,22,-22,32,-32,…,q2,-q2,(q<=m/2),就可以双向寻找可能的空位置,从而避免关键字聚集在某一块区域。

其公式可表示为:
fi(key)=(f(key)+di)%m (di=1^2,-1^2,2^2,-2^2,3^2,-
3^2,...,q^2,-q^2,q<=m/2)
3、开链法
概念:将多有关键字为同义词的键值对存储在一个单链表中,在哈希表中只存储链表的头指针。

优点:对于会造成很多哈希冲突的哈希函数来说,都能保存在对应的存储位置上,不用冲突换址。

缺点:查找时需要遍历单链表找到要查找的关键字的位置,会造成性能上的损耗。

线性探测法和开链法是常用的解决哈希冲突的方法。

4、再哈希函数法
概念:准备多个哈希函数,如:除留余数法、折叠法、平方取中法等,每当发生存储地址冲突时,就换一个哈希函数计算,直到把哈希冲突解决掉。

优点:关键字的存储位置不会发生聚集;缺点:增加了哈希函数计算的时间
5、公共溢出区法
概念:除了一个哈希基本表,再准备一个溢出表,存入时,将有存储位置冲突的键值对存储到溢出表中;查找时,通过哈希函数计算出存储地址,先与基本表相应位置的关键字进行比对,若相等就查找成功,若不相等就到溢出表查找。

优点:若冲突数据较少时,查找性能较高。

相关文档
最新文档