【发布时间】:2013-05-11 10:45:39
【问题描述】:
今天早上我刚接受了一次面试,我收到了一个问题“给出一个从整数列表中删除重复项的算法”。这是一个相当标准的问题,所以我很有信心可以回答。
我是在解释,但我说了类似“您可以使用哈希表。从第一个整数开始并将其插入哈希表。然后对每个连续的整数进行哈希表查找以检查该整数是否已经存在在哈希表中,如果没有,则插入它,如果它已经存在,则将其丢弃,因为它是重复的。因此以这种方式遍历列表。如果哈希表设计正确,则查找和插入平均应该是恒定时间。”
然后面试官回答(我再次解释)“但是哈希表查找不是恒定时间,它们取决于其中已经有多少元素。您描述的算法将是 O(n^2)”
然后我回答“真的吗?我认为如果你设计了一个好的散列函数,它会是常数时间吗?通常是 O(n)”
然后面试官回答“所以你是说一个有很多条目的哈希表和一个有很少条目的哈希表的查找时间是一样的”
然后我说“是的。如果设计正确的话。”
然后面试官说“这不是真的”
所以我现在很困惑。如果有人能指出我哪里错了,我将不胜感激
【问题讨论】:
-
如果这些人给你一份工作,你应该礼貌地拒绝。
-
要么这个人不知道他在说什么,要么他在看你是否有足够的知识来为你的案子辩护。唯一我会说不同的 - 而不是“是的。如果设计正确”,我会说“渐近地,是的,具有良好的哈希函数并假设哈希表足够大。偶尔可能会有碰撞,但它应该保持 O(1)。"。
-
哦,除了一个好的散列函数,你还需要分布良好的数据。即使使用有史以来最好的哈希函数,仍然存在一个数据集,您会在其中遇到许多冲突,从而导致对哈希表进行 O(n) 操作。总而言之,他们可能希望您建议对数据进行排序,或者他们只是在彻底检查您的理解。
-
Pathological(最坏的)情况也是一个很好的术语 - “当用于测试输入时,意味着它被故意设计为最坏的情况。两种意义上的含义是数据是非常病态的,或者有人必须明确着手破坏算法才能提出这样一个疯狂的例子。”
标签: duplicates hashtable