这些算法的最佳和最差情况分析是什么?

时间:2014-07-21 23:25:09

标签: algorithm c#-4.0 c#-3.0 big-o time-complexity

int n = int.Parse(Console.ReadLine()); 
int i=n; 
while(i>1) {
    Console.Write(i); 
    i%=2; 
}

int n = int.Parse(Console.ReadLine()); 
int x=0; 
for(int i=0;i<=n;++i) 
{  
    for(int j=0;j<=i;++j) 
    { 
        for(k=1;k<=n;k++) 
        { 
            x++; 
        } 
    }
}

int n=int.Parse(Console.ReadLine());
int x=0,y=1;
for( int i=n; i > 1 ; i /= 3 )
    for(int j=1;j<=n;j*=5)
    { 
        x++; 
        if ( x < n/2 )
            y*=2;
        else
            y--; 
    }

据我所知,第一段代码的大O是O(1)而不管输入 n ,第二段代码是O(n ^ 3)再次无论输入如何,我都不确定第三段代码!但我们的老师问我们最好和最坏的情况!没有最好或最坏的!我是对的吗?

2 个答案:

答案 0 :(得分:2)

第一个块应该最多迭代两次。

对于第二个区块:

enter image description here

对于第三个块(请查看此document的最后一张幻灯片):

enter image description here

答案 1 :(得分:0)

  

据我所知,第一段代码的大O是O(1)而不管输入n是什么,对于第二段代码,无论输入如何,它都将是O(n ^ 3)。但我们的老师问我们最好和最坏的情况!没有最好或最坏的!我是对的吗?

是的,没错。

while(i>1) {
    i%=2; 
}

这将立即完成。你修改为零的任何数字都会给你1或0。

for(int i=0;i<=n;++i) 
{  
    for(int j=0;j<=i;++j) 
    { 
        for(k=1;k<=n;k++) 
        { 
        } 
    }
}

对我来说这看起来像O(n^3)。外循环发生n次,每次外循环发生时,中间循环平均发生n/2次,每次外循环发生时内循环发生n-1次。 n * 2n * (n-1)简化为O(n^3)

最糟糕和最好的情况对于这两者都是相同的:你不能真正选择一系列数字来输入,这会导致复杂性随着它们变大而不遵循相同的渐近模式。