哈希表

作者: Cracks_Yi | 来源:发表于2017-07-28 15:49 被阅读0次

1.哈希表原理

哈希表的基本思想是:用哈希函数 f: key -> address将关键字映射到该记录在表中的位置。当不同关键字映射到同一位置时,称为发生了碰撞(collision)。

常用哈希函数有:直接定址法(f(key) = a*key + b)、除留取余法(f(key)=key%p)等。

常用冲突解决方法有:
1)开放寻址法。
即当一个关键字和另一个关键字发生冲突时,使用某种探测技术在Hash表中形成一个探测序列,然后沿着这个探测序列依次查找下去,当碰到一个空的单元时,则插入其中。

2)链地址法/拉链法。
采用数组和链表相结合的办法,将Hash地址相同的记录存储在一张线性表中,而每张表的表头的序号即为计算得到的Hash地址。

无冲突的哈希表复杂度是O(1),一般是O(c),c为哈希关键字冲突时查找的平均长度,最坏情况仍然是O(N)。

2.Java中的HashMap

HashMap原理是先调用key的hashcode()函数计算出hashcode,hashcode进行一次哈希后hash % table.length找到数组index,然后遍历链表通过key的equals()找到键值对。当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

存储数据示意图:

这里顺便提一下==,equals和hashcode。
对于基本数据类型(byte, short, int, long, char, float, double, boolean),==判断的是值相等。对于复合数据类型,比较的是他们在内存中的存放地址。在Object类中定义了equals(Object o)和hashcode()两个方法,equals默认是用==比较的,有些类如String, Integer类中重写了equals方法。Java规范中,两个对象相同(equals),hashcode一定相等;两个对象不同,hashcode可能相等。

相关文章

  • Java数据结构_哈希表_基本概念

    本文目标 哈希表的基本概念,哈希冲突,哈希函数 什么是哈希表 哈希表也叫做散列表(hash有剁碎的意思)哈希表是空...

  • redis数据结构--字典

    Redis的字典底层就是哈希表。 哈希表 首先给出哈希表的定义: 其中可以看到,table是一个哈希表节点的数组,...

  • 哈希表和链表

    优秀文章:Chapter: 散列表(哈希表) 一、哈希表 哈希表hashtable(key,value) 就是把K...

  • 算法-哈希表算法总结

    1 哈希表模拟 思路:通过设计哈希表,模拟O(1)时间复杂度的哈希表。 2 数组作为哈希表 思路:数组就是简单的哈...

  • 数据结构 -- 哈希表及其应用

    这篇主要用来记录一下学习到的关于哈希表的知识点。 文章结构 哈希表 哈希表的定义 哈希表的优缺点 哈希碰撞 负载因...

  • 数据结构与算法(第一季):哈希表(Hash Table)

    一、哈希表(Hash Table) 1、概念 哈希表也叫做散列表。 哈希表的原理: 利用哈希函数生成key对应的i...

  • 深入理解哈希表

    深入理解哈希表 深入理解哈希表

  • 2019 算法面试相关(leetcode)--哈希表

    哈希表相关的原理可以参考下:浅谈哈希表(HashTable)深入理解哈希表哈希表的理解理解HashSet及使用 哈...

  • Redis中的字典

    Redis中的字典 Redis中的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表结点,而每个哈希表结点保...

  • Redis数据结构与对象——哈希

    1 字典的实现 Redis的字典使用哈希表作为底层实现,一个哈希表可以有多个哈希表节点,即每个哈希表节点就保存了字...

网友评论

      本文标题:哈希表

      本文链接:https://www.haomeiwen.com/subject/ppmokxtx.html