【问题标题】:Basic Hashtable algorithm - removing duplicates基本哈希表算法 - 删除重复项
【发布时间】:2013-05-11 10:45:39
【问题描述】:

今天早上我刚接受了一次面试,我收到了一个问题“给出一个从整数列表中删除重复项的算法”。这是一个相当标准的问题,所以我很有信心可以回答。

我是在解释,但我说了类似“您可以使用哈希表。从第一个整数开始并将其插入哈希表。然后对每个连续的整数进行哈希表查找以检查该整数是否已经存在在哈希表中,如果没有,则插入它,如果它已经存在,则将其丢弃,因为它是重复的。因此以这种方式遍历列表。如果哈希表设计正确,则查找和插入平均应该是恒定时间。”

然后面试官回答(我再次解释)“但是哈希表查找不是恒定时间,它们取决于其中已经有多少元素。您描述的算法将是 O(n^2)”

然后我回答“真的吗?我认为如果你设计了一个好的散列函数,它会是常数时间吗?通常是 O(n)”

然后面试官回答“所以你是说一个有很多条目的哈希表和一个有很少条目的哈希表的查找时间是一样的”

然后我说“是的。如果设计正确的话。”

然后面试官说“这不是真的”

所以我现在很困惑。如果有人能指出我哪里错了,我将不胜感激

【问题讨论】:

  • 如果这些人给你一份工作,你应该礼貌地拒绝。
  • 要么这个人不知道他在说什么,要么他在看你是否有足够的知识来为你的案子辩护。唯一我会说不同的 - 而不是“是的。如果设计正确”,我会说“渐近地,是的,具有良好的哈希函数并假设哈希表足够大。偶尔可能会有碰撞,但它应该保持 O(1)。"。
  • 哦,除了一个好的散列函数,你还需要分布良好的数据。即使使用有史以来最好的哈希函数,仍然存在一个数据集,您会在其中遇到许多冲突,从而导致对哈希表进行 O(n) 操作。总而言之,他们可能希望您建议对数据进行排序,或者他们只是在彻底检查您的理解。
  • Pathological(最坏的)情况也是一个很好的术语 - “当用于测试输入时,意味着它被故意设计为最坏的情况。两种意义上的含义是数据是非常病态的,或者有人必须明确着手破坏算法才能提出这样一个疯狂的例子。”

标签: duplicates hashtable


【解决方案1】:

如果有人能指出我错在哪里

你一点都没错:正确设计的哈希表给你预期的查找效率O(1) 并插入摊销的O(1),所以你的算法是O(N)。由于可能的重复解析,在重负载哈希表中的查找确实慢了一点,但预期的查找时间仍然是O(1)。对于不计入“摊销”的实时系统,这可能不够好,但在所有实际情况下,这已经足够了。

当然,对于最坏情况 O(N*LogN) 算法,您始终可以为您看到的项目使用平衡树,或者如果数字有合理的界限(例如,在 0 到 100,000 之间),您可以使用布尔值用于测试O(1) 最坏情况下的成员资格的数组,以及由于较小的常数乘数而对哈希表的潜在改进。

【讨论】:

  • 这正是我的想法。有一次,面试官甚至重复了我说的话,所以我知道他没有听错我的话。我不知道这怎么可能,它是一家相当大的公司。
  • 我认为重要的是要注意预期查找时间是O(1)。无论您选择哪种散列函数,最坏的情况是您运气不好并与 all 插入发生冲突,从而导致 O(n) 查找时间。即使使用通用散列策略也是如此。
  • @dbyrne 你说得对,值得一提的是预期与最坏情况。谢谢!
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2012-12-05
  • 2018-11-17
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多