如何找到一个巨大的数字列表,两个数字,其中xi = xj?

时间:2012-06-20 09:20:20

标签: arrays algorithm hash

我有以下问题,并且我对使用哈希的解决方案感到尖叫:

问题:

如果有大量的数字,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中存储的值的xjA[k] - 对于最坏的情况,此处的总运行时间将为O(n),如果映射的值在A的最后一个单元格中有两个数字(如果它们确实存在)。

1 个答案:

答案 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)包含零作为初始值。