存在问题"Find the element repeated more than n/2 times"
请帮助估算使用随机的解决方案的时间复杂度:
如果我使用提供随机统一数字的完美随机生成器,这种方法的最坏情况会是什么? O(N²)
?
我的直觉说,平均而言,它应该在两次尝试中给出答案,但这只是平均情况。怎么证明呢?我不太确定如何估计随机算法的运行时间。
答案 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
为止。
如果数组a
中m
为E[X] = n/m
次,则为E[X] = n/(⌊n/2⌋+1) < n/(n/2) = 2
次。因此,对于我们最糟糕的情况输入,我们得到O(n)
。
因此,这种随机算法的最坏情况复杂度为{{1}}。