基本思想
以关键字 key 为自变量,通过一个确定的函数 h(散列函数),计算出对应的函数值 h(key),作为数据对象的存储地址可能不同的关键字会映射到同一个散列地址上,即 h(keyi) = h(keyj)(当 keyi≠ keyj),称为“冲突”——需要某种冲突解决策略。
常用策略
换个位置:开放地址法
同一位置的冲突对象组织在一起:链地址法
开放定址法
一旦产生了冲突(该地址已有其它元素),就按某种规则去寻找另一空地址若发生了第 i 次冲突,试探的下一个地址将增加 di,基本公式是: hi (key) = (h(key)+di) mod TableSize (1 ≤ i ≤ TableSize)di 决定了不同的解决冲突方案。
1. 线性探测
以增量序列 1,2,…, (TableSize - 1) 循环试探下一个存储地址
2. 平方探测法
以增量序列+1,-1,+2,-2,+4,-4,+8,-8……且 q ≤ ⌊ TableSize/2 ⌋ 循环试探下一个存储地址如果散列表长度是某个 4k+3(k是正整数)形式的素数时,平方探测法就可以探查到整个散列表空间。
3. 双散列
二次再散列法是指第一次散列产生哈希地址冲突,为了解决冲突,采用另外的散列函数或者对冲突结果进行处理的方法。
4. 再散列
当散列表元素太多(即装填因子 α 太大)时,查找效率会下降解决的方法是加倍扩大散列表,这个过程就叫"再散列",扩大时,原有元素需要重新计算放置到新表中