算法笔记(十三)哈希冲突


1、哈希函数理解:将元素通过一个函数转换为整数,使该整数可以尽量唯一地代表这个元素。(转换前key,转换后H(key)

H为散列函数


2、转换的函数:

(1)直接定址发法(恒等变换):H(key)=key;

(2)平方取中法:取key的平方的中间若干位作为hash值

(3)除数留余法:

                     H(key) = key%mod

      将计算结果作为数组下标(TSize必须小于mod);


3、冲突形成:

除留余数法,可能会有两个不同的key1和key2的哈希值H(key1)和H(key2)相同,这时候key1已将H(key1)位置占据了,那么key2则不能使用这个位置!(举例: 3%2=1, 5%2=1)

解决方法:

(1)线性探查法:

当得到key的hash值H(key),但是表中下标H(key)已经被占据了,则探查下一个位置H(key)+1是否被占用,如果没有则使用这个位置;若超过表长则回到表首部循环;

(2)平方探查法:

当得到key的hash值H(key),但是表中下标H(key)已经被占据了。

探查顺序:H(key)+1^2, H(key)-1^2, H(key)+2^2, H(key)-2^2, H(key)+3^2, H(key)+3^2.........

若探查中,H(key)+k^2超过了表长TSize,那么将H(key)+k^2取模;若H(key)-k^2<0,则将(( H(key)-k^2 )%TSize+TSize)%TSize作为结果;

(3)链地址法(拉链法)

不计算新的值,将所有H(key)相同的key连接成一个单链表(link),范围Link[0]~Link[mod-1],其中Link[h]存放H(key)=h;

当多个关键字key的哈希值H(key)时,将这些冲突的key直接用单链表连接起来,遍历这条链表寻找H(key)=h的key;



猜你喜欢

转载自blog.csdn.net/u014252478/article/details/80631004