【问题标题】:Hash Collision Linear Probing Running Time哈希碰撞线性探测运行时间
【发布时间】:2012-04-21 13:03:00
【问题描述】:

我正在和朋友一起做作业,有一个问题是关于线性探测方法的搜索、添加和删除的平均运行时间。我认为它是 O(n),因为它必须检查一定数量的节点,直到找到要添加的开放节点。并且在搜索时,它从原始索引开始并向上移动,直到找到所需的数字。但我的朋友说它是 O(1)。哪个是对的?

【问题讨论】:

  • 我想补充一下 Yavar 的答案:记住,O(1) 不是一个单一的操作。它可能是一个很大的常数,但如果它不是从像 n 这样的变量派生的,那也没关系。即使您需要经过 20 个节点来放置哈希,它仍然是 O(1)。当然,这仅适用于哈希表,前提是某些条件为真,但对于设计良好的哈希表,平均为 O(1)

标签: algorithm data-structures hashtable asymptotic-complexity


【解决方案1】:

当我们谈论渐近复杂性时,我们通常会考虑非常大的 n。现在对于哈希表中的冲突处理,一些方法是链式哈希和线性探测。在这两种情况下,可能会发生两件事(这将有助于回答您的问题): 1. 由于哈希表已满,您可能需要调整其大小 2. 可能会发生冲突。

在最坏的情况下,这将取决于你如何实现你的哈希表,比如在线性探测中你找不到数字,你继续移动并且你正在寻找的数字在最后。这是 O(n) 最坏情况下的运行时间。谈到链式哈希技术,当发生冲突时,要处理它们说我们已经将密钥存储在平衡二叉树中,因此最坏情况下的运行时间将是 O(log n)。

现在达到最佳情况运行时间,我认为没有混淆,无论哪种情况都是 O(1)。

O(n) 会在最坏的情况下发生,而不是在设计良好的哈希表的平均情况下发生。如果在平均情况下开始发生这种情况,哈希表将不会在数据结构中找到位置,因为平均而言,平衡树将始终为您提供 O(log n) 并且在此之上也会保留顺序。

很抱歉这么说,但不幸的是你的朋友是对的。你的情况会在最坏的情况下发生。

还可以在这里查看更多信息,即摊销运行时间:Time complexity of Hash table

【讨论】:

  • 谢谢@DanAllen,你上面的评论真的很激励:)
猜你喜欢
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-17
  • 2023-04-04
相关资源
最近更新 更多