Big O for while循环

时间:2011-10-03 17:53:17

标签: big-o

前几天我的任务中有这个问题,但我仍然不确定我是否正确。

for(int i =1; i <n; i++)   //n is some size
{             
    for(j=1; j<i; j++)
    {
        int k=1;

        while (k<n)
        {
           k=k+C;   //where C is a constant and >=2
        }
    }
}

我知道嵌套for循环是O(n ^ 2)但我不确定while循环。我假设整个代码都是O(n ^ 3)。

4 个答案:

答案 0 :(得分:2)

    int k=1;

    while (k<n){
       k=k+C                    //where C is a constant and >=2
    }

这将采取(n-1)/C步骤:写u =(k-1)/ C.然后,k = Cu + 1,语句变为

u=0;
while(u < (n-1)/C) {
    u=u+1
}

因此while循环是O(n)(因为C是常数)

编辑:让我试着以相反的方式解释它。

从虚拟变量u开始。循环

u=0;
while(u < MAX) {
    u = u+1
}

运行MAX次。

当你放MAX = (n-1) / C时,循环是

u=0;
while(u < (n-1)/C) {
    u=u+1
}

这会运行(n-1)/C次。

现在,支票u < (n-1)/C相当于C*u < n-1C*u + 1 < n,因此循环相当于

u=0;
while(C*u + 1 < n) {
    u=u+1
}

现在,假设我们根据变量k = C * u + 1重写了这个循环。然后,

u=0;
k=1; // C * 0 + 1 = 1

循环看起来像

while(C*u + 1 < n) {
while(k < n) {

,内在条件是

    u=u+1
    k=k+C //C * (u+1) + 1 = C * u + 1 + C = old_k + C 

全部放在一起:

    int k=1;

    while (k<n){
       k=k+C
    }

需要(n-1)/C步。

答案 1 :(得分:2)

内部循环字面上是O(n/C)=O(n),所以是的,总的来说是O(n^3)(第二个循环的上限为O(n)

答案 2 :(得分:1)

正式地,您可以继续使用以下方法(Sigma Notation):

enter image description here

其中a表示最内层循环内的常量操作数(a = 1,如果要计算确切的迭代次数)。

答案 3 :(得分:0)

好吧,您需要查看为给定的n和C值运行while循环体的次数。例如,n为10,C为3.主体将运行3次:k = 1, k = 4,k = 7.对于n = 100且C = 2,主体将运行50次:k = 1,3,5,7,9,...,91,93,95,97,99。这是一个由C计数到n的问题。您应该能够从该线索计算Big-O复杂性。