我有以下问题,并且我对使用哈希的解决方案感到尖叫:
问题:
如果有大量的数字,x1........xn
xi <= T
,我们想知道
是否存在两个索引i,j
,其中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
的最后一个单元格中有两个数字(如果它们确实存在)。
答案 0 :(得分:3)
同样的方法可以快〜两倍(平均),平均仍然O(n)
- 但是有更好的常数。
无需将所有元素映射到哈希值然后重复使用 - 更快的解决方案可能是:
for each element e:
if e is in the table:
return e
else:
insert e into the table
另请注意,如果T < n
,则pigeonhole principle中的第一个T+1
元素中必须存在欺骗。
对于小T
,您可以使用大小为T的简单数组,不需要哈希(hash(x) = x)
。 Initializing T can be done in O(1)
包含零作为初始值。