1 学习
核心:循环内的代码体与循环结束条件之间的关系
比较好判断的直接看循环嵌套的层数即可,一层嵌套就是线性阶,二层嵌套就是平方阶。
但这是忽略了循环体内的情况呀
如果循环体内有一些改变,使得循环的次数发生改变,那么很有可能阶数会发生变化
例如Logn阶
int count=1;
n=64
int items=0;
while(count<n){
count=count*2;//todo注意看的是这行的执行次数与n的关系
itmes++;
}
如上为典型的二分法,阶数为logn,而非简单的一层循环O(n)
2 实践
下面给出一些常见的例子
(1)
k=0;
for(i=1; i<=n; i++) {
for(j=i; j<=n; j++)
@ k++;
}
解:对于i从1到n的遍历,j的起始位置从1到n开始进行终点为n的遍历
所以最终结果就是等差数列求和1到(n-1),答案为n(n-1)/2
(2)
for(i=1; i<=n; i++) {
for(j=1; j<=i; j++) {
for(k=1; k<=j; k++)
@ x += delta;
}
尝试写出起始的几个数
1 + (1 + 2) + (1 + 2 + 3) ······
复杂度为等差数列和的求和
由数学知识可以得到复杂度为O(n*n*n)
(3)
(7) x=n; y=0;
while(x>=(y+1)*(y+1)) {
@ y++;
}
显然结果为根号n
ps:还没学过LaTex…