一文详解哈希表的哈希冲突

源码(Java)

在java中,哈希表用hashtable表示,存储结构是通过数组来实现的。

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

    /**
     * The hash table data.
     */
    private transient Entry<?,?>[] table;

    /**
     * The total number of entries in the hash table.
     */
    private transient int count;
    ............................
}

哈希冲突

分离链接法

将散列到同一个值得所有元素保留到一个表中。每个位置存放一个指向单链表的指针,冲突的元素依次插入这个单链表的末尾。
在这里插入图片描述

开放寻址法

设H(key)是哈希函数,如果H(key1) = H(keyi),那么keyi存储位置Hi = ( H(key) + di ) mod m,其中m为表长。

线性探测法

  1. 线性探测再散列。

如果不同的key值映射到一个位置时,继续往后探测,找到空出插入。(当index=table.size()时将index置为0继续找),找到空处插入。

  1. 平方探测再散列

与左边不同的点是,从映射位置处起,在i ^ 2后的位置插入数据。(数据较分散)

  1. 随机探测在散列

再散列法

准备若干个hash函数,如果使用第一个hash函数发生了冲突,就使用第二个hash函数,第二个也冲突,使用第三个……,以此类推。

总结

哈希表是最常见的数据结构之一,其中哈希冲突的处理是重点。处理的方法有分离链接法、开放寻址法和再散列法

发布了122 篇原创文章 · 获赞 1476 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/JAck_chen0309/article/details/105225691