Algorithm “最坏情况”的运行时;找到重复n/2次以上的元素“;使用随机

Algorithm “最坏情况”的运行时;找到重复n/2次以上的元素“;使用随机,algorithm,random,big-o,complexity-theory,Algorithm,Random,Big O,Complexity Theory,有一个问题 请您帮助估算使用随机变量的解决方案的时间复杂度: 在数组中拾取随机元素 遍历数组并计算所选元素的出现次数 如果计数>N/2-返回该元素 重复步骤1 如果我使用提供随机均匀数的完美随机生成器,这种方法的最坏情况是什么O(N²) 我的直觉告诉我,平均来说,它应该在两次尝试中给出答案,但这只是一般情况。如何证明呢?我不太确定如何估计随机算法的运行时间。假设实际上有一个元素出现超过n/2次,预期的运行时间是O(n)。你可以这样想——每次你选择一个元素时,你都需要做O(n)运算来检查它是否是多

有一个问题

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

  • 在数组中拾取随机元素
  • 遍历数组并计算所选元素的出现次数
  • 如果计数>N/2-返回该元素
  • 重复步骤1
  • 如果我使用提供随机均匀数的完美随机生成器,这种方法的最坏情况是什么<代码>O(N²)


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

    假设实际上有一个元素出现超过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

    (我们知道这个总和正好是2,尽管证明它有点混乱。)

    但是,在最坏的情况下,每次选择一个元素时,都会选择一个不是多数元素的元素。这是非常不可能的,虽然-概率,你没有找到一个多数元素后,k轮最多是2-k。当k=300时,这个数字小于宇宙中原子数的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

    (我们知道这个总和正好是2,尽管证明它有点混乱。)

    但是,在最坏的情况下,每次选择一个元素时,都会选择一个不是多数元素的元素。这是非常不可能的,虽然-概率,你没有找到一个多数元素后,k轮最多是2-k。当k=300时,这个数字小于宇宙中原子数的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)。

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

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

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

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

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

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

    因此,这个随机算法的最坏情况复杂度为
    O(n)

    如果我们谈论最坏情况复杂度,我们指的是输入的最坏情况,即迫使算法进入最坏可能运行时间的输入

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

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

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

    因此,该随机算法的最坏情况复杂度为
    O(n)