【问题标题】:How to locate in a huge list of numbers, two numbers where xi=xj?如何在一个巨大的数字列表中找到 xi=xj 的两个数字?
【发布时间】:2012-06-22 09:42:40
【问题描述】:

我有以下问题,它在向我寻求哈希解决方案:

问题:

鉴于大量的数字,x1........xn 其中xi <= T,我们想知道 是否存在两个索引i,j,其中x_i == x_j
O(n) 运行时找到一个算法,并且期望为O(n),来解决这个问题。

我目前的解决方案:我们使用散列,我们将使用chaining 映射函数h(x)

首先 - 我们构建一个新数组,我们称之为 A,其中每个单元格都是一个链表 - 这将是目标数组。

现在 - 我们在所有 n 数字上运行,并使用哈希函数将 x1........xn 中的每个元素映射到其正确位置。这将花费O(n) 运行时间。

之后,我们将在A 上运行,并寻找冲突。如果我们找到一个单元格,length(A[k]) > 1 然后我们返回映射到存储在A[k] 中的值的xixj - 如果两个数字的映射值(如果它们确实存在),在最坏的情况下,这里的总运行时间将是O(n) ) 在A 的最后一个单元格中。

【问题讨论】:

  • 散列也需要O(n) 空间。这是允许的吗? (考虑到这是一个巨大的数字列表)
  • @Goo:关于空间什么都没说,那我想那是不言而喻的。
  • T
  • 散列不能真正给你 O(n) 运行时间,只有 O(n) 预期 运行时间。想象一下,如果所有数字都映射到相同的哈希值会发生什么。

标签: arrays algorithm hash


【解决方案1】:

同样的方法可以快两倍(平均而言),平均仍为O(n) - 但具有更好的常数。

无需将所有元素映射到哈希中然后再遍历它 - 更快的解决方案可能是:

for each element e:
  if e is in the table:
      return e
  else:
    insert e into the table

还请注意,如果T < n,则必须在T+1 的第一个T+1 元素中存在欺骗,来自pigeonhole principle
同样对于小的T,您可以使用大小为T 的简单数组,不需要散列(hash(x) = x)Initializing T can be done in O(1) 包含零作为初始值。

【讨论】:

  • +1 由于算法表明xi <= T,因此他们很可能想到了一个普通数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2015-07-26
  • 2019-02-16
  • 1970-01-01
  • 2018-07-15
  • 2014-10-19
  • 1970-01-01
相关资源
最近更新 更多