大哦分析运行时间?

时间:2012-09-29 03:57:31

标签: big-o

对于以下每个程序片段,请对运行时间进行Big-Oh分析。我有两个问题,我不是100%肯定,如果有的话,有人可以帮助我

片段1:

for( int  i  =  0;  i  <  n;  i++ )
      for(  int  j  =  0;  j  <  n  *  n;  j++ )
            for(  int  k  =  0;  k  <  j;  k++ )
                 sum++;

答案:O(n ^ 5)不确定n * n ??

片段2:

for(  int  i  =  1;  i  <=  n;  i++ ) 
        for(  int  j  =  1;  j  <=  i  *  i;  j++ )
                             if (j % i == 0)
                   for(  int k  =  0;  k  <  j;  k++)
                  sum++;

答案:为O(n ^ 4)

2 个答案:

答案 0 :(得分:0)

每个循环分解问题空间。从最外层循环开始。真正的循环是什么?

对于第一个问题,我们有以下模式。

  • 外部循环将 n 次。
  • 外部内部循环将运行 n 2 次,并且不受内部循环的当前值的约束。
  • 最里面的循环将运行到 j 次,这将使其受到外部内循环的当前值的约束。
  • 您的所有步骤都是线性块,这意味着您将以线性方式从0到达结束条件。

以下是求和的实际情况。

Linear summation, no skipping or stepping over anything.

那么,这会转化为什么?你必须展开总和。但是,它不会是O(n 5 )。

对于第二个问题,我们有以下模式。

  • 外部循环运行至 n 次。
  • 外部内环循环至 i 2 次。
  • j % i == 0的条件下,最里面的循环运行到 j 次。这意味着最里面的循环不是每隔时间执行

我会留下这个问题让你解决。你必须采取展开总和并将它们减少到代数对应物的方法。

答案 1 :(得分:-1)

片段1的

 lets say m = n^2
 Sigma(i=0...n)  m Sigma(j=0.....m) j
 => n * (m(m+1)/2)
 => n ^ 5

答案:O(n ^ 5)

片段2的

last loop runs for i-1 times ...
Sigma(i=0...n)  Sigma(j=0.....i-1) Sigma(k=0.....j) k
approximately its Sigma(i=0...n) i^2 
~=> n^3

答案:为O(n ^ 3)