for(i=0;i<n;i++)
for(j=1,sum=a[0];j<=i;j++)
sum+=a[j];
首先这是一个嵌套循环,外层循环先做了 i=0;一次赋值操作,算做 +1,i从0到n-1,一共进行了
(n-1)-0+1次操作,即n次++操作,算作 +n, 外层每循环一次,内层就会执行j=1,sum=a[0];这两项赋值操作就会执行 2*n次,因为内层循环的上限不是n,而是 i,即对于外层n次循环,每次内存只能达到 i,内存执行一次,就会有j++;sum+=a[j];两次操作,所以进行2*(1+2+3+....+n-1)次(提示:i最大就是n-1),综上进行
1+n+2n+2(1+2+3+...+n-1)=n^2+2n+1=O(n^2)
我们知道了分析之后,再来看这个问题就很容易了,开始的 i 赋值肯定是有一次的,外层i++,和 内层 j=1,sum=a[0],就是3n次(关于j和sum可以看成外层n次循环下的第一级操作),j++,和sum+=a[j];两次操作(可以看出外层n次循环下的第二级操作),要注意内循环上限是 i,就知道内循环了(1+2+3+4+...+n-1),所以最终执行赋值操作 2*(1+2+3+...+n-1)次 (对j和sum的操作)
当然你如果只想知道O(n^2),那么就不需要分析低数量级的操作,不过知道具体的细节肯定是有好处的。
for(i=1;i<=n;i++)
for(int j=1;j<=n;j+=i)
cout<<’*’;
总体来看这段代码, 先 i赋值 算1次,i++; 算n次,内循环要注意int j=1;是变量初始化,不是赋值操作,(之前困扰了我,上网查了一下)所以确切的来说不能算 n次,
j的上限是n ,但是步长在变,是 i,j从1到 n,步长是i ,取整约进行了 n/i 次
所以是 1+n+(n/1+n/2+n/3+.....+n/n)=O(nlogn)
要是想要证明:
最后1+In(n)<logn, 两边同时乘n,即得到相应的结果