使用哈希表检查数组中是否存在重复

时间:2015-02-17 10:17:55

标签: arrays algorithm data-structures hash time-complexity

  

目标:检查大小为n的数组中是否存在重复的数字。

基本上,如果我们可以使用哈希表(open-hash,带有链表),那么我们可以迭代数组并将数字插入表中并带有一些值(可能是1,不是&#39真的很重要。 在迭代时,如果单元格不是空的,那么我们有一个重复的数字。

由于我们知道读取/写入的预期时间为O(1),因此算法的预期时间为O(n)

问题#1:为什么最坏情况等于O(nlogn)问题2:您是否会采用与建议的解决方案不同的方式?

1 个答案:

答案 0 :(得分:1)

在这里,我假设作者提到了一个哈希表的变体,其中每个“bin”中都有一个BST(或其他一些确定性DS),因此在最坏的情况下,所有元素都被插入到同一个bin repeatidly - 这总体上需要O(nlogn)
然而,哈希表很少以这种方式实现,因为这种最坏的情况是不太可能的,并且在这个实现中实现了常规链表,对于这种情况 - 对于这个解决方案,最坏的情况是O(n^2)

解决此问题的另一种方法是sort,并迭代查找重复项(在排序数组中很容易),这是O(nlogn),内存使用量明显减少。

这个问题被称为element distinctness problem,这两个选项(可能有一些变体)是解决它的方法。
众所周知,Omega(nlogn)没有使用额外的内存和散列。