什么是总频率计数和运行时间(Big-O表示法)?

时间:2010-02-16 14:58:06

标签: runtime big-o performance

我有以下代码段:

1. for (i = 1; i < n; i++) 
2.    for (j = 1; j < i*i; j++) 
3.      if(j % i == 0)
4.         for(k = 0; k < j;k++)
5.            sum++; 

总频率计数和运行时间(Big-Oh表示法)是什么?

频率计数检查片段代码并预测要执行的指令数(例如,对于每个指令,预测每个指令将在代码运行时遇到多少次。)

我试着用以下方式分析:

  

Loop1执行n-1次,然后执行F.C.是2n
  循环2执行(i i)-1次,然后执行F.C.是3(我 i)
  loop1 + loop2的总频率计数为2n + sum(从i = 1到n-1)3 * i * i
  我有if(j%i == 0)的问题。什么是循环执行?
  循环4执行j次,然后执行F.C.是2j + 2

4 个答案:

答案 0 :(得分:3)

前两行(i和j循环)是n ^ 3。

第4行,k循环是n ^ 2。我很想把他们混在一起说n ^ 5。但是你必须考虑第3行的if。

if语句仅在每i次迭代时为真,因此必须除以i(即除以n):( n ^ 3)/ n = n ^ 2给出n ^ 2 * n ^ 2 = n ^ 4。

为O(n ^ 4)

答案 1 :(得分:2)

让我们尝试一种实验方法,而不是严格的数学方法。我有心情去玩。使用java:

    int n = 5;  long prevSum=0;
    while (n <= 320) {
         long sum = 0;
         n *= 2;

         // insert original code here   

         System.out.printf("n = %d  sum = %d", n, sum);
         if (prevSum > 0) {
             System.out.printf(" ratio %f", ((double)sum) / ((double)prevSum) ); 
         }
         System.out.println();
         prevSum = sum;
    }

输出结果为:

n = 10  sum = 870
n = 20  sum = 16815 ratio 19.327586
n = 40  sum = 293930 ratio 17.480226
n = 80  sum = 4909060 ratio 16.701460
n = 160  sum = 80222920 ratio 16.341809
n = 320  sum = 1297105040 ratio 16.168759
n = 640  sum = 20862446880 ratio 16.083853

当n加倍时,sum乘以约19.3。当n为40时,总和为293930,比率为17.48(293930/16815 = 17.48)。当n增加时,比率接近16.由于2 ^ 4 = 16,答案是O(n ^ 4)。顺便说一句,最后一行需要很长时间才能计算出来。

为O(n ^ 4)

答案 2 :(得分:1)

这里有些可疑的东西:

1. for (i = 1; i < n; i++) 
2.    for (j = 1; j < i*i; j++)      // <-- These two lines.
3.      if(j%i==0)                   // <-- 
4.         for(k=0; k<j;k++)
5.            sum++;

因为当j是i的倍数时我们只执行循环体,所以为什么不计算i:

1. for (i = 1; i < n; i++) 
2.    for (j = i; j < i*i; j += i) 
3.        for(k=0; k<j;k++)
4.            sum++; 

哪个是O(n ^ 4)

查看原始算法。前两行做O(n ^ 3)工作。然后O(n ^ 2)的时间,(j%i == 0),我们做O(n ^ 2)更多的工作。所以上面的算法是O(n ^ 4)。

答案 3 :(得分:0)

你有一笔钱:

TimeComplexity =

= Sum_ {i = 1..n} Sum_ {j = 1..i ^ 2}(1 + [j%i = 0] * Sum_ {k = 1..j} 1)=

= Sum_ {i = 1..n} Sum_ {j = 1..i ^ 2}(1 + [j%i = 0] * j)=

= Sum_ {i = 1..n} Sum_ {j = 1..i ^ 2} 1 + Sum_ {i = 1..n} Sum_ {j = 1..i ^ 2} [j%i = 0] * j =

= Sum_ {i = 1..n} i ^ 2 + Sum_ {i = 1..n}(i + 2i + 3i + ... + i * i)=

= Sum_ {i = 1..n} i ^ 2 + Sum_ {i = 1..n} i(1 + 2 + 3 + ... + i)=

= Sum_ {i = 1..n} i ^ 2 + Sum_ {i = 1..n} i ^ 2(i + 1)/ 2 =

= Sum_ {i = 1..n}(i ^ 3 + O(i ^ 2))=

= O(n ^ 4)。

享受