无限循环的大O?

时间:2016-04-22 19:39:09

标签: algorithm time-complexity big-o

请考虑以下代码:

int value = 0;

while(getRandomNumber() != 1000) {
    value++;
}

return value;

上述代码的大O(最坏情况,最佳情况和平均情况)是什么?

6 个答案:

答案 0 :(得分:7)

在谈到复杂性时,n是以位为单位的输入大小。这里有没有输入。因此n是固定的,等于0。因此从技术上讲,没有复杂性,因为输入大小不会有任何变化。

然而,你可以提出这样的问题:循环平均,最大或最小地执行多少次......

答案 1 :(得分:4)

这里的问题没有多大意义。首先,大O符号取决于输入,这里根本没有输入算法。

此处执行的时间取决于getRandomNumber及其基础分布的可能值集。

例如,如果您的RNG从[1 to 100]返回数字 - 算法永远不会完成。另一方面,如果它仅以相同的概率生成10001001,则平均需要2次迭代才能完成。更糟糕的情况是无限,但它根本没有任何意义,因为它是如此不可能。

答案 2 :(得分:1)

  1. 最糟糕的情况是O(∞),最好的情况是0(1)

  2. 是的,但每个算法都有复杂度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) - 常数。