最坏情况运行时"找到重复超过n / 2次的元素"随机使用

时间:2015-04-14 00:26:57

标签: algorithm random big-o complexity-theory

存在问题"Find the element repeated more than n/2 times"

请帮助估算使用随机的解决方案的时间复杂度:

  1. 在数组中选择随机元素
  2. 遍历数组并计算所选元素的出现次数
  3. 如果计数是> N / 2 - 返回该元素。
  4. 从步骤1开始重复。
  5. 如果我使用提供随机统一数字的完美随机生成器,这种方法的最坏情况会是什么? O(N²)

    我的直觉说,平均而言,它应该在两次尝试中给出答案,但这只是平均情况。怎么证明呢?我不太确定如何估计随机算法的运行时间。

4 个答案:

答案 0 :(得分:2)

假设实际上有一个元素出现的次数超过n / 2次,则预期的运行时间为O(n)。你可以这样思考 - 每次你选择一个元素时,你需要做O(n)工作来检查它是否是多数元素。那么问题是,你需要选择多少元素,期望值。每次你随机选择一个元素时,你至少有1/2的概率选择一个多数元素。在期望中,这意味着在找到多数元素之前,您需要选择两个元素,因此运行时将为O(n)。如果您对此感到好奇,请注意,在确切的k探针(k> 0)之后找到您正在寻找的内容的概率最多为2 -k ,因为您需要让第一个k-1探针不成功,然后让第k个探针成功。然后,您可以将期望值计算为

  

0 * 2 -0 + 1 * 2 -1 + 2 * 2 -2 + ...

     

= 2

(已知这个总和恰好有两个,虽然证明它有点混乱。)

在最糟糕的情况下,每次选择元素时,您都会选择不属于多数元素的元素。但这是非常不可能的 - 在k轮之后你没有找到多数元素的概率最多为2 -k 。对于k = 300,此数字小于宇宙中原子数的1。因此,即使你不能限制最坏情况的运行时间,它也是不可能的,你可以放心地忽略它。

希望这有帮助!

答案 1 :(得分:2)

此算法的最坏情况运行时间没有限制。

"完美"随机数发生器的输出不能取决于以前的历史;否则它将是不完美的(真实世界的伪rngs以这种方式是不完美的,所以你可能能够构建一个特定PRNG的真实界限。)

因此,在RNG猜测多数元素的位置之前,可能需要进行任意数量的猜测。

如果您允许重新排列数组,则可以将错误的猜测交换到数组(仍未知)部分的开头,然后将猜测限制为尚未取消的位置。这会将迭代次数限制为n / 2-1,因此算法的最坏情况运行时间为O(n 2 )。

虽然它对big-O运行时没有影响,但你几乎总能提前停止计数扫描,因为你已经找到了n / 2 + 1个元素,或者因为没有足够的未扫描元素留给将计数提升到该阈值。即使进行了这种优化,单次扫描的最坏情况(交替元素)时间仍为n,预期扫描仍为O(n)。

答案 2 :(得分:1)

对于随机算法,预期的运行时间可以更好地表征其运行时间。对于您描述的算法,预期的运行时间最多为

S = n * 1/2  + 2n * 1/2^2 + 3n * 1/2^3 + ... up to infinity

我们可以解决这个问题如下:

S =      n/2 + 2n/2^2 + 3n/2^3  + ... up to infinity
2S = n + 2n/2 + 3n/2^2 + 4n/2^3 + ... up to infinity

(subtracting the top from bottom)
S = n + n/2 + n/4 + n/8 + ... up to infinity
  = 2n 

所以预期的运行时间是O(n)。

答案 3 :(得分:0)

如果我们谈论最坏情况复杂性,我们指的是输入的最坏情况,即强制算法进入最差情况的输入可能的运行时间。

随机算法也是如此。我们计算了最坏情况输入的预期复杂度。

在您的示例中,最差的输入是长度为n的数组,只包含a ⌊n/2⌋+1次的数字。

复杂性现在为O(n)⋅E[X],其中X是您必须从数组中随机选择一个数字的尝试次数,直到您选择a为止。 如果数组amE[X] = n/m次,则为E[X] = n/(⌊n/2⌋+1) < n/(n/2) = 2次。因此,对于我们最糟糕的情况输入,我们得到O(n)

因此,这种随机算法的最坏情况复杂度为{{1}}。