【发布时间】: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] 中的值的xi 和xj - 如果两个数字的映射值(如果它们确实存在),在最坏的情况下,这里的总运行时间将是O(n) ) 在A 的最后一个单元格中。
【问题讨论】:
-
散列也需要
O(n)空间。这是允许的吗? (考虑到这是一个巨大的数字列表) -
@Goo:关于空间什么都没说,那我想那是不言而喻的。
-
T
-
散列不能真正给你 O(n) 运行时间,只有 O(n) 预期 运行时间。想象一下,如果所有数字都映射到相同的哈希值会发生什么。