哈希表中的链接和探测有什么区别?

时间:2016-04-10 14:38:56

标签: data-structures hashtable probing

他们是如何运作的?他们的主要区别是什么?他们各自的权衡取舍是什么?他们的类型是什么(如果有的话)?什么时候优先考虑另一个(如果有的话)?

PS:我已经通过了Anagrams - Hashing with chaining and probing in CWhy do we use linear probing in Hash tables when there is separate chaining linked with lists?,但两者似乎都没有形成对比。

1 个答案:

答案 0 :(得分:8)

在Hashtables中使用链接和开放寻址(其简单实现基于线性探测)来解决冲突。只要两个不同键的哈希函数指向同一位置来存储值,就会发生冲突。

为了存储两个值,使用不同的密钥存储在同一位置,链接和开放寻址采用不同的方法:链接通过创建具有相同散列的值的链接列表来解决冲突; open-addressing尝试尝试查找不同的位置来存储具有相同哈希值的值。

开放寻址冲突解决的线性探测的一个有趣的替代方法是所谓的双重哈希

产生的主要差异在于检索在不同条件下散列的值的速度。

让我们从chaining开始作为碰撞解决方案。请注意,在计算Lisa的哈希函数之后,您需要从列表中获取第一个元素以获取所需的值。因此,您可以访问指向列表头部的指针,然后访问值:2次操作。

另一方面,使用开放寻址,例如linear-probing,当没有碰撞时,您立即获得您正在寻找的值。也就是说,您只需要1次操作,这样会更快。

但是,当您的HashTable开始变满,并且您的load factor高时,由于更频繁发生冲突,探测将要求您在找到所需的实际值之前检查更多Hashtable位置。在大约0.8的负载系数下,由于多次冲突,链接开始变得更有效:你必须探测很多空单元以便通过探测找到你想要的实际值,而使用链接你有一个值列表具有相同的哈希键。

这只是一个快速概述,因为实际数据,键的分布,使用的哈希函数以及冲突分辨率的精确实现将对您的实际速度产生影响。