8

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

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

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

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

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

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

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

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

4

1 回答 1

4

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

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

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

于 2013-05-16T13:53:01.147 回答