哈希表结构 笔记

ⅰ亾dé卋堺 提交于 2020-03-16 19:50:33

Hash-Table (空间换时间)

  1. 利用哈希函数生成对应的index(o(1);
  2. 利用生成的index(O(1)) 来操作指定位置的元素 O(1) 时间复杂度

Hash 冲突:

  1. 两个不同的key ,经过哈希函数计算出相同的结果解决办法:
    1) 开放定址法:按照一定规则向其他地址探测,直到遇到空桶
    2) 再Hash法 :利用另一个Hash函数再次计算,看是否与第一个相
    3) 链地址法:通过链表将同一index的元素串起来

JDK 1.8 解决Hash冲突:

  1. 默认单向链表将元素串起来
  2. 在添加元素时有可能将单向链表转为红黑树(当哈希表容量大于64 或者链表节点数大于8)
  3. 当红黑树的节点少于一定数量后,也会转成单向链表

表为什么使用单链表?
1.挨个比较key 相同就覆盖掉 不同就尾插
2. 每次从头开始比较
3. 节省空间 比双链表少一个指针

Hash 函数:

  1. 先生成key 的哈希值
  2. 再让key 的哈希值与数组的大小进行相关的计算 生成索引值(Hash(key)要小于数组)
  3. Hash(key)%table.length 为了提高效率 ,可以将 % 更换为 & (前提是将数组的长度设计为2En) Hash(key)&(table.length-1) ——》 按照此方法得出的数字必然小于table.length (2En -1 保证数字全部是1)

良好的哈希函数:

  1. 算出的索引分布比较均匀
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!