哈希表—链地址法

冰冻非一日之寒

哈希冲突是不可避免的,所以我们在设计哈希函数的同时,也要设计解决哈希冲突的办法。

哈希表本质就是一个数组。

通过上一篇知识求出关键字所对应的索引,存储到数组中即可。素数M也是数组的长度

哈希表&数组

通过哈希函数求得的哈希值可能会是一个负数,对哈希值求绝对值即可。有时我们也会见到以下表达式

关键字&索引

哈希值按位与上一个16进制数。

原理:这个16进制数转化为2进制就是一个0,三十一个1。计算机中对整型的表示,第一个数字表示符号位(0代表整数,1代表负数)

将一个整数与之按位与后,第一位肯定是0(代表整数),后面是整数原来的数字。即最后只是改变了整数的符号位,并将这个整数变成正整数

求绝对值

这样,就得到了一个正整数。

当两个不同的关键字求得的索引相同时,该如何存储呢?

图片发自简书App

开辟一个数组,有M个空间,在每一个空间中存储一个链表,这个链表实际上就是一个查找表,可以存储多个数据

图片发自简书App

查找表可以使用一个平衡树(红黑树)结构。

TM的底层实现是红黑树

这样,数组中的每一个空间就有一个TreeMap数组(红黑树)了。

在Java8之前,数组中每一个空间对应的就是一个链表

Java8,当哈希冲突达到一定程度后,每一个空间从链表转成红黑树

JAVA


在Java8中,为什么要有这一步的转化操作呢?

因为,当我们的数据规模比较小的时候,也就是哈希冲突比较小,使用链表可以更快的进行增删改查等操作。而使用红黑树的话,还要进行旋转操作,这反而让操作更复杂。





以上就是解决哈希冲突最常用的链地址法

推荐阅读更多精彩内容

  • 培根好吃阅读 758评论 0 0
  • 有两个字典,分别存有 100 条数据和 10000 条数据,如果用一个不存在的 key 去查找数据,在哪个字典中速...
    和风细羽阅读 2,030评论 0 5
  • 前情提要——二叉树 叶子节点就是左右孩子都是空的,但是并不是每一颗树都像上图所示的那样这么规整,有些树树可以只有左...
    冒绿光的盒子阅读 416评论 0 1
  • 如需转载, 请咨询作者, 并且注明出处.有任何问题, 可以关注我的微博: coderwhy, 或者添加我的微信: ...
    coderwhy阅读 9,743评论 19 115
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 4,314评论 0 13
  • 1.事件:中秋假期第一天,同学女儿结婚,见到老同学叙旧。之后开车看老娘。 2.我的感受:开心,仿佛回到学生时代。看...
    快乐当下阅读 42评论 0 0
  • 2017.6.18 今天讲了两种吸粉的办法,一个是附近人,一个是...
    龙猫蔡亚珊阅读 105评论 0 0
  • 这几天发生的事情让我感触很深,也很多。现在的我处于人生的最低谷,很落魄也很卑微(本来想说可怜但我讨厌可怜这...
    小杂草敏阅读 332评论 0 1
  • 上次的课讲到了齐家。如果说之前的“诚意、正心”都是在“修身”,都是在针对自身,那“齐家”就是在推己及人,把之前总结...
    迷糊的空庭阅读 209评论 0 0
  • 今天一大早,看到窗外的罂粟开花了。开的如此妖娆。感谢你,让我收获一份美好的心情。 雨刚停,花瓣上还有雨滴。 我感...
    WOTOW金阅读 39评论 0 1