美文网首页
散列表:分离链表法与开放定址法

散列表:分离链表法与开放定址法

作者: Ray昱成 | 来源:发表于2018-11-29 15:23 被阅读0次

散列表

理想状态下,散列表就是一个包含关键字的固定大小的数组,通过使用散列函数,将关键字映射到数组的不同位置。下面是理想散列表的一个示意图:


image.png

在理想状态下,哈希函数可以将关键字均匀的分散到数组的不同位置,不会出现两个关键字散列值相同(假设关键字数量小于数组的大小)的情况。但是在实际使用中,经常会出现多个关键字散列值相同的情况(被映射到数组的同一个位置),我们将这种情况称为散列冲突。为了解决散列冲突,主要采用下面两种方式:

  • 分离链表法(separate chaining)
  • 开放定址法(open addressing)

分离链表法
分散链表法使用链表解决冲突,将散列值相同的元素都保存到一个链表中。当查询的时候,首先找到元素所在的链表,然后遍历链表查找对应的元素。下面是一个示意图:

image.png
开放定址法
开放定址法不会创建链表,当关键字散列到的数组单元已经被另外一个关键字占用的时候,就会尝试在数组中寻找其他的单元,直到找到一个空的单元。探测数组空单元的方式有很多,这里介绍一种最简单的 – 线性探测法。线性探测法就是从冲突的数组单元开始,依次往后搜索空单元,如果到数组尾部,再从头开始搜索(环形查找)。如下图所示:
image.png
关于两种方式的比较,可以参考 这篇文章
参考地址:
http://blog.zhangjikai.com/2017/03/29/%E3%80%90Java-%E5%B9%B6%E5%8F%91%E3%80%91%E8%AF%A6%E8%A7%A3-ThreadLocal/

相关文章

  • 散列表:分离链表法与开放定址法

    散列表 理想状态下,散列表就是一个包含关键字的固定大小的数组,通过使用散列函数,将关键字映射到数组的不同位置。下面...

  • Python源码学习笔记 5 字典对象

    Python中对于字典的实现是根据key进行hash生成散列表,算法为“开放定址法” 1.PyDictEntry(...

  • 数据结构:处理散列冲突的方法

    开放定址法: 一旦发生冲突 就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到。 再散列函数法:每...

  • 开放地址法散列

    开放地址法 开放地址法是另一种(相对于分离链接法)解决散列冲突的方法。适用于装填因子(散列表中元素个数和散列表长度...

  • hash table

    哈希冲突 1.开放定址法 2.再哈希法 3.链地址法(JAVA官方,默认使用单向链表将元素串起来,在添加元素时,可...

  • 哈希冲突的四种解决办法

    Hash算法解决冲突的方法一般有以下几种常用的解决方法 1, 开放定址法: 所谓的开放定址法就是一旦发生了冲突,就...

  • java.util.HashMap底层实现原理

    解决哈希冲突的方案有多种: 开放定址法:发生冲突,继续寻找下一块未被占用的存储地址; 再散列函数法; 链地址法(H...

  • 算法小专栏:散列表(二)

    本篇将重点介绍:解决散列冲突的四种方案。 一、开放定址法: 1.1 定义: 描述:为产生冲突的地址H(key)求得...

  • 解决hash冲突的方法

    开放定址法 这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产...

  • Redis底层数据结构

    1.简单动态字符串 2.链表 3.字典 哈希冲突解决办法:1.开放定址法当关键字key的哈希地址p=H(key)出...

网友评论

      本文标题:散列表:分离链表法与开放定址法

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