本文已使用 Google Cloud Translation API 自动翻译。
某些文档最好以原文阅读。
在这篇文章中,我们将讨论哈希表中的冲突解决技术。当两个键映射到相同的哈希值时,就会发生冲突。有几种方法可以解决冲突,我们将在本文中介绍。
链接是一种冲突解决技术,其中哈希表中的每个槽都是一个链表。当发生冲突时,密钥被添加到该插槽的链表中。
为了搜索密钥,我们对密钥进行哈希处理并转到相应的插槽。然后,我们在那个插槽的链表中搜索密钥。插入和搜索的时间复杂度都是 O(n),其中 n 是哈希表中键的数量。
链接的优点之一是易于实现。另一个优点是可以轻松调整哈希表的大小。要调整哈希表的大小,我们只需创建一个新的哈希表并将旧哈希表中的所有键插入到新的哈希表中。
开放寻址是一种冲突解决技术,其中密钥存储在哈希表本身中。开放寻址有几种不同的方法,我们将讨论这些方法。
线性探测是一种开放寻址方法,我们在哈希表中寻找下一个空槽,直到找到一个空槽。如果我们到达哈希表的末尾,我们绕回并从哈希表的开头继续。
为了搜索密钥,我们对密钥进行哈希处理并转到相应的插槽。如果那个槽是空的,我们就知道这个键不在哈希表中。如果槽不为空,我们将那个槽中的键与我们正在搜索的键进行比较。如果它们不相等,我们继续搜索下一个插槽。插入的时间复杂度为 O(1),但搜索的时间复杂度为 O(n),其中 n 是哈希表中键的数量。
线性探测的优点之一是易于实现。另一个优点是键在哈希表中均匀分布,因此没有空槽。
二次探测是一种开放寻址方法,我们通过将 1、4、9、16、25 等添加到哈希值来寻找下一个空槽。
为了搜索密钥,我们对密钥进行哈希处理并转到相应的插槽。如果那个槽是空的,我们就知道这个键不在哈希表中。如果槽不为空,我们将那个槽中的键与我们正在搜索的键进行比较。如果它们不相等,我们继续搜索下一个插槽。插入的时间复杂度为 O(1),但搜索的时间复杂度为 O(n),其中 n 是哈希表中键的数量。
二次探测的优点之一是易于实现。另一个优点是键在哈希表中均匀分布,因此没有空槽。
双哈希是一种开放寻址方法,我们使用两个哈希函数来计算下一个槽。
为了搜索密钥,我们对密钥进行哈希处理并转到相应的插槽。如果那个槽是空的,我们就知道这个键不在哈希表中。如果槽不为空,我们将那个槽中的键与我们正在搜索的键进行比较。如果它们不相等,我们继续搜索下一个插槽。插入的时间复杂度为 O(1),但搜索的时间复杂度为 O(n),其中 n 是哈希表中键的数量。
双哈希的优点之一是易于实现。另一个优点是键在哈希表中均匀分布,因此没有空槽。
在这篇文章中,我们讨论了哈希表中的冲突解决技术。我们讨论了链接、线性探测、二次探测和双重哈希。链接是一种技术,其中哈希表中的每个槽都是一个链表。开放寻址是一种将密钥存储在哈希表本身中的技术。线性探测、二次探测和双重哈希都是开放寻址的方法。