【问题标题】:Worst case runtime for "Find the element repeated more than n/2 times" using random使用随机“查找重复超过 n/2 次的元素”的最坏情况运行时
【发布时间】:2015-04-14 00:26:56
【问题描述】:

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

您能否帮助估计使用随机的解决方案的时间复杂度:

  1. 随机选取数组中的元素
  2. 遍历数组并计算所选元素的出现次数
  3. 如果计数 > N/2 - 返回该元素。
  4. 从第 1 步开始重复。

如果我使用提供随机统一数字的完美随机生成器,这种方法最坏的情况是什么? O(N²)?

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

【问题讨论】:

    标签: algorithm random big-o complexity-theory


    【解决方案1】:

    假设实际上有一个元素出现超过 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。因此,即使您无法限制最坏情况的运行时,它也极不可能,您可以放心地忽略它。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      该算法的最坏情况运行时间没有界限。

      “完美”随机数生成器的输出不能依赖于之前的历史;否则它将是不完美的(现实世界的伪 rng 以这种方式是不完美的,因此您可能能够为特定的 PRNG 构建一个真实的界限)。

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

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

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

      【讨论】:

        【解决方案3】:

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

        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)。

        【讨论】:

        • O(n) 是正确的,但是在最后一次扫描中检查的元素数(可能)会小于 n,因为当计数达到 (n+1)/2 时您可以停止,这可能会在您看到 n 个元素之前发生(如果最常见元素的实例超过 (n+1)/2 个,则肯定会在您看到 n 个元素之前发生)。
        【解决方案4】:

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

        这与随机算法相同。我们计算最坏情况输入的预期复杂度。

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

        现在的复杂度是O(n)⋅<b>E</b>[X],其中X 是在您选择a 之前,您必须从数组中随机选择一个数字的尝试次数。 如果 am 在数组中的次数 <b>E</b>[X] = n/m 成立。因此,对于最坏情况的输入,我们得到<b>E</b>[X] = n/(⌊n/2⌋+1) &lt; n/(n/2) = 2

        所以这个随机算法的最坏情况复杂度为O(n)

        【讨论】:

        • O(n)⋅E[X]预期的复杂性,而不是最坏的情况。
        • @chepner 这不是那么容易...如果概率大约是 输入 的随机位,这是真的。也许有人在算法的随机性和输入的随机性之间没有区别,但我认为在这种情况和大多数其他情况下这没有意义。最后是关于使用随机算法的复杂性的定义。
        • 最坏情况复杂度对于随机算法的定义非常好,与输入无关。这正是我们为它们定义预期时间复杂度的原因,这样我们就可以对它的复杂性说一些比“最坏情况下的时间复杂度是无限的”更有用的东西。
        • @chepner 我认为 cmets 不适合讨论这个问题。我知道一些教授至少使用了一种不同的定义。如果您有兴趣,我们可以开始聊天。
        猜你喜欢
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多