请教一个BIG O Notation 问题
int i,j,k;for (i = 1; i < n; i++)
for (j = 0; j < i*i; j++)
if (j % i == 0)
for (k = 0; k < j; k++)
sum++;
整个片断该如何分析?红色部分会被执行多少次,是否可以忽略
希望各位不吝赐教
----------------解决方案--------------------------------------------------------
int i,j,k,counter=0;
for (i = 1; i < n; i++)
for (j = 0; j < i*i; j++)
{
counter++; //执行次数.
if (j % i == 0)
for (k = 0; k < j; k++)
sum++;
}
红色部分不能忽略,if是for()运行的前提条件。而sum++;要执行多少次由它上面的for确定,是最近的for的执行语句。
----------------解决方案--------------------------------------------------------
counter++ 的确可以算出执行了多少次
但能否用n表达出来?
因为最后我要写出这个片段总共执行多少次的表达式
----------------解决方案--------------------------------------------------------
没明白您要表达什么意思
----------------解决方案--------------------------------------------------------
就是说如果不包括红色部分的话
这个程序会被执行 (2(n^3)-3(n^2)-n)/6 次 Big O 分析就是 O(n^3)
现在我不知道加上红色那部分
这个程序会被执行多少次
----------------解决方案--------------------------------------------------------
饿,搞了半天您让我算这个...
这个我也算不来...
----------------解决方案--------------------------------------------------------
对于一个确定的i ,红色部分if语句被执行i次(即j%i==0有i次为真)
所以if语句一共被执行1+2+3+...+n-1=n*(n-1)/2
[此贴子已经被作者于2006-8-23 20:48:07编辑过]
----------------解决方案--------------------------------------------------------
多谢楼上的
也感谢soft_wind
----------------解决方案--------------------------------------------------------
不过我还是算不出这个程序总共被执行了多少次
----------------解决方案--------------------------------------------------------
最底层的sum++是无法用n的代数式表示的,
那个红色的for也是无法用n的代数式表示的.
----------------解决方案--------------------------------------------------------