哈希冲突的解决办法
-
线性探测法
-
使用数组来存储哈希表,可设置标志来判断该位置是否为空。
-
存放时,如果哈希计算结果冲突,将新的表项放在下个空闲的存储单元。
if (Hashtable[j].data == -1) {Hashtable[j].data = key;} else {key++; j = hash(key);}
-
检索时,发现当前
hash
地址里存放的不是需要的元素,就从下一个存储单元开始逐个探查。if (Hashtable[j].data != -1 && Hashtable[j].data != key) {key++ j = hash(key);}
示例:
表长为
11
的哈希表中已填有关键字为17
,60
,29
的记录,H(key)=key MOD 11
; 现有第 4 个记录,关键字为38
, 按线性探测法处理冲突的方法,将它填入。 -
-
平方探测法
从发生冲突的地址 d 开始,得到一个探查序列:
d
,d+1^2,
d-1^2
,d+2^2
,d-2^2
,d+3^2
,d-3^2
,·······示例:
关键字集为
{47, 7, 29 , 11, 16, 92, 22, 8}
,哈希表表长为 11,Hash(key)=key MOD 11
,用二次探测法填入3
。
示例:
已知一组关键字 (19, 14, 23, 1, 68, 20, 84, 27, 55, 11, 10, 79)
,哈希函数为:H(key) = key MOD 13
,设每个记录的查找概率相等,求平均查找长度。