【问题标题】:What is the difference between chaining and probing in hash tables?哈希表中的链接和探测有什么区别?
【发布时间】:2023-06-08 01:07:01
【问题描述】:

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

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? 我已经用过,但似乎都没有在这两种方法之间形成对比。

【问题讨论】:

标签: data-structures hashtable probing


【解决方案1】:

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

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

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

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

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

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

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

这只是一个简单的概述,因为实际数据、键的分布、使用的哈希函数和冲突解决的精确实现都会影响你的实际速度。

【讨论】:

  • 感谢您的回答。您能否详细说明它们的工作原理和类型? TIA。
  • 当然可以,但稍后我必须添加该信息。您正在寻找任何特定信息吗?根据您的问题,我了解到您知道它们是如何工作的。
  • 我已将问题编辑为包含how do they work? :D 感谢您的指出。
  • 添加了请求的额外信息。我保留了介绍性的描述:有关哈希表的更多信息可以在 Cormen 等人的著作《算法简介》中找到。