散列表:分离链表法与开放定址法
散列表
理想情况下,散列表(Hash Table)是一个包含关键字的固定大小数组。通过使用散列函数(Hash Function),将关键字映射到数组的不同位置。理想散列表的结构示意图如下:

在理想状态下,哈希函数可以将关键字均匀地分散到数组的不同位置,不会出现两个关键字散列值相同的情况(假设关键字数量小于数组的大小)。但是在实际使用中,经常会出现多个关键字散列值相同的情况(被映射到数组的同一个位置),我们将这种情况称为散列冲突(Hash Collision)。
为了解决散列冲突,主要采用下面两种方式:
- 分离链表法(Separate Chaining)
- 开放定址法(Open Addressing)
分离链表法
分离链表法使用链表解决冲突,将散列值相同的元素都保存到一个链表中。当查询的时候,首先找到元素所在的链表,然后遍历链表查找对应的元素。下面是一个示意图:

开放定址法
开放定址法不会创建链表。当关键字散列到的数组单元已经被另外一个关键字占用的时候,就会尝试在数组中寻找其他的单元,直到找到一个空的单元。
探测数组空单元的方式有很多,这里介绍一种最简单的——线性探测法(Linear Probing)。线性探测法就是从冲突的数组单元开始,依次往后搜索空单元;如果到数组尾部,再从头开始搜索(环形查找)。如下图所示:

参考资料
关于两种方式的比较,可以参考以下文章:
- 散列表冲突处理比较
- 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/
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/san-lie-biao--fen-li-lian-biao-fa-yu-kai-fang-ding-zhi-fa.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。