Advertisement

Hash冲突的解决办法

阅读量:

Hash冲突的解决办法(参考资料)

开放定址法

亦称开放定址法为再散列技术。当关键字key的哈希地址p=H(key)发生碰撞时,则以p为基础来计算新的哈希地址N。其中N = (H_1(key) + H_2(key) + ... + H_m(key)) \mod m

复制代码
    /** * 说明:N 代表计算出来的新的哈希地址     TableSize为表长
    */
    N = (H(key) + di) % TableSize       i=1,2,3.....n

这里根据 di 的计算公式不同又可分为 线性探测平方探测双散列

  1. 线性探测

线性探测所采用的公式为

复制代码
>     di = i
>  
>  
>       
>  
>

在哈希地址p起始点开始依次搜索空余的插槽以放置新元素到相应的插槽中

  1. 平方探测

平方探测所采用的公式为

复制代码
>     di = \pm i ^ 2
>  
>  
>       
>  
>

也就是从哈希地址p出发, 乘以i的n次方, 寻找向前与向后的可用空槽位置, 将新元素存入相应的空槽中。值得注意的是, 在平方探测法中可以向前或向后寻找可用位置, 而在线性探测中则仅限于向后寻找可用位置

  1. 双散列

双散列所采用的公式为

复制代码
>     di = i * H_2(key)  
>  
>  
>       
>  
>

其中

复制代码
>     H_2(key)
>  
>  
>       
>  
>

为新的hash函数

链地址法

将所有被映射至同一位置p的元素组织为同一个链表,并接着使该hash表中位于位置p的所有节点均指向该链表。这正是Java中的HashMap类采用的方式以解决哈希冲突问题。

建立一个公共溢出区域

这种方法的核心理念是:将哈希表划分为两个组成部分——基本表和溢出表。对于所有产生冲突的元素,则全部放入溢出表。

再哈希法:

采用多个哈希函数来处理数据冲突的情况:首先计算出一组数据对应的冲突哈希值后,则改用另一个哈希函数进行计算;继续使用新的哈希函数进行计算直至获得不同的结果。

全部评论 (0)

还没有任何评论哟~