我有以下代码段:
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
答案 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)。
享受