循环

时间:2016-08-26 08:37:28

标签: java math big-o

我想知道以下(java)代码的重要符号是什么:

while (n > 0) {
     while (n > 0){
        n-- ;
    }
 } 

如果我使用 n = 10 ,它将在外循环中执行一次迭代,在内循环内执行10次迭代。
总共 11次迭代对吗?
如果我使用 n = 100 ,它将在外循环中进行一次迭代,在内循环中进行100次迭代。
总共 101次迭代对吗?
但这就是我被卡住的地方。因为我认为符号是O(n)。仅仅因为我认为迭代几乎等于n。 但我不知道如何证明这一点?

我在数学方面的表现并不多,所以明确的解释是适当的

3 个答案:

答案 0 :(得分:6)

非正式地说,对于正参数,外部循环只进行一次迭代,因为内部循环n减少到零。内部循环将进行精确的n次迭代,因此内部循环的运行时复杂性为O(n)。总的来说,虽然外环的终止条件在语法上取决于n,但它实际上独立于n。总体复杂性可以看作O(n+c),其中c是表示外部循环执行的常量。但是,O(n+c)等于O(n)

你可能会感到困惑的是,在你的术语中,你说的是一个循环的 101次迭代,你实际上是指两个不同的循环。

答案 1 :(得分:2)

它是O(n),因为外环运行一次。当内循环结束时,外循环的条件也是假的。因此外环对O符号并不重要。

答案 2 :(得分:1)

是的,是O(n)。然而,即使是简单算法的数学证明并不容易。

你能做的是应用最薄弱的前提条件来正式分析这一点。 见https://en.wikipedia.org/wiki/Predicate_transformer_semantics#While_loop

非正式地,很容易看出,在内部之后 n> = 0必须为真,无论内部循环内部发生了什么。如果n> = 0则外部while将结束。因为这在内部while之后每次都发生(无论它的内容如何),所以外部循环永远不会执行多次。

最薄弱的前提可以用来更正式地证明这一点,但如果你将它应用于更大的问题,你的头脑肯定会开始疼痛。虽然它具有教育意义。