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

What is the difference between chaining and probing in hash tables?

它们是如何工作的?他们的主要区别是什么?他们各自的权衡是什么?它们的类型是什么(如果有的话)?什么时候一个人更喜欢另一个人(如果有的话)?

PS:我已经经历过Anagrams - Hashing with chaining and probing in C and Why do we use linear probing in Hash tables when there is separate chaining linked with lists?,但是这两种方法似乎都没有形成对比。

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

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

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

出现的主要区别在于检索在不同条件下被散列的值的速度。

让我们从 chaining 作为冲突解决方案开始。这里要注意,为Lisa计算完哈希函数后,需要先从列表中获取第一个元素,才能得到需要的值。因此,您访问指向列表头部的指针,然后访问值:2 操作。

另一方面,使用开放式寻址,例如linear-probing,当没有冲突时,您会立即获得您要查找的值。即只需1次操作,速度更快。

但是,当您的 HashTable 开始变满并且您的 HashTable 很高时 load factor,由于冲突发生的频率更高,探测将需要您检查更多的 Hashtable 位置,然后才能找到您想要的实际值想。在负载因子大约为 0.8 时,由于多次碰撞,链接开始变得更加高效:您必须探测大量空单元格才能通过探测找到您想要的实际值,而通过链接您有一个值列表具有相同的哈希键。

这只是一个快速概览,因为实际数据、密钥的分布、使用的散列函数以及冲突解决的精确实施都会对您的实际速度产生影响。