我有以下问题,它向我尖叫着寻求哈希的解决方案:
问题 :
给定一个巨大的数字列表x1........xn
where xi <= T
,我们想知道是否存在两个索引i,j
where x_i == x_j
。在运行时
找到一个算法,并且该问题的期望值为 。O(n)
O(n)
我目前的解决方案:我们使用散列,我们将在其中h(x)
使用chaining
.
首先 - 我们构建一个新数组,我们称之为它A
,其中每个单元格都是一个链表 - 这将是目标数组。
现在 - 我们在所有n
数字上运行,并使用散列函数将 中的每个元素映射x1........xn
到其应有的位置。这需要O(n)
运行时间。
之后,我们将继续运行A
,并寻找碰撞。如果我们会找到一个单元格,length(A[k]) > 1
然后我们将返回xi
和xj
映射到存储的值A[k]
- 这里的总运行时间将是O(n)
最坏的情况,如果两个数字的映射值(如果它们确实存在)在最后的细胞A
。