请考虑以下代码:
int value = 0;
while(getRandomNumber() != 1000) {
value++;
}
return value;
上述代码的大O(最坏情况,最佳情况和平均情况)是什么?
答案 0 :(得分:7)
在谈到复杂性时,n
是以位为单位的输入大小。这里有没有输入。因此n
是固定的,等于0
。因此从技术上讲,没有复杂性,因为输入大小不会有任何变化。
然而,你可以提出这样的问题:循环平均,最大或最小地执行多少次......
答案 1 :(得分:4)
这里的问题没有多大意义。首先,大O符号取决于输入,这里根本没有输入算法。
此处执行的时间取决于getRandomNumber
及其基础分布的可能值集。
例如,如果您的RNG从[1 to 100]
返回数字 - 算法永远不会完成。另一方面,如果它仅以相同的概率生成1000
和1001
,则平均需要2次迭代才能完成。更糟糕的情况是无限,但它根本没有任何意义,因为它是如此不可能。
答案 2 :(得分:1)
最糟糕的情况是O(∞)
,最好的情况是0(1)
。
是的,但每个算法都有复杂度O(∞)
,因此它不是非常有用的信息。
答案 3 :(得分:1)
您正在寻找的是预期的时间复杂度。在您的特定情况下,这是geometric distribution的预期值(平均值)。
例如,循环的预期迭代次数由下式给出:
E[iterations] = (1 - p) / p
其中p
是获得1000的概率。
p = P(X=1000)
答案 4 :(得分:1)
<强>摘要强>
其他人已经指出了很好的信息,但未能解决一些非常重要的问题。一旦引入随机化,您需要查看预期时间,而不是确定性分析。回答你的问题:
Ω(1)
O(∞)
关于最佳案例的说明
注意最好的情况是它是大omega,而不是大O(https://www.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/big-big-omega-notation)
预期分析
一旦引入随机化,您就不再依赖确定性分析。相反,你开始处理“预期分析”。正如Mateen指出的那样,您的实例可以通过几何分布来解决。由于我不知道你的随机数函数可以返回的值范围(也不知道数字的分布),我们无法直接回答你的问题。 Mateen的分析看起来不错,因为他没有假设你获得1000的概率。
附注
对于其他类型的随机问题,您可以使用其他工具,例如Marchov Chains(https://en.wikipedia.org/wiki/Markov_chain)。我已经看到了这些用于分析随机在线算法(https://en.wikipedia.org/wiki/Adversary_model)的工具,如果您对此感兴趣,那么这些链接应该为您提供了大量其他可供阅读的链接。
随机化的引入为算法分析增添了新的乐趣。希望这有帮助,并享受乐趣:)
答案 5 :(得分:0)
如果some_statement
是并且在整个循环期间保持为假,那么,是的,循环是无限的并且具有O(无穷大)复杂度。
然而,一旦some_statement
变为真,循环就变得有限。如果some_statement
在开始时为真,它甚至可以是O(1) - 常数。