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

源码(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函数,第二个也冲突,使用第三个……,以此类推。

总结

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

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天才程序YUAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值