今天早上我接受了一次采访,我得到了一个问题“给出一个从整数列表中删除重复项的算法”。这是一个相当标准的问题,所以我非常有信心可以回答它。
我正在解释,但我说的是“你可以使用哈希表。”从第一个整数开始并将其插入哈希表。然后对于每个连续的整数执行哈希表查找以检查整数是否已经在散列表中,如果没有那么插入它,如果它已经存在然后扔掉它,因为它是重复的。所以以这种方式迭代列表。如果散列表设计正确,查找和插入应该是平均的恒定时间。“
然后面试官回应了(我再说一遍)“但哈希表查找不是恒定时间,它们取决于已经有多少元素。你描述的算法将是O(n ^ 2)”
然后我回答“真的吗?我认为如果你设计了一个好的哈希函数,那将是恒定的时间吗?通常是O(n)”
然后面试官回答“所以你说的是,对于有很多条目的哈希表和几个条目的哈希表,查找时间是相同的”
然后我说“是的。如果设计得当。”
然后面试官说“这不是真的”
所以我现在很困惑。如果有人能指出我错在哪里,我将非常感激
答案 0 :(得分:3)
如果有人可以指出我错在哪里
您完全没有错:设计合理的哈希表为您提供O(1)
的预期查找效率,并以分摊的O(1)
进行插入,因此您的算法为O(N)
。由于可能存在重复的分辨率,因此负载较重的哈希表中的查找确实有点慢,但预期的查找时间仍为O(1)
。对于“摊销”不计算的实时系统来说,这可能不够好,但在所有实际情况下这都足够了。
当然,对于最坏情况O(N*LogN)
算法所见的项目,您总是可以使用平衡树,或者如果数字具有合理的界限(例如,在0到100,000之间),您可以使用一个布尔数组,用于测试O(1)
最坏情况下的成员资格,以及由于常数乘数较小而对哈希表的潜在改进。