提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
情形一(累加)
for(int i=0; i<n; i++){
// do something
}
// 1.判断内层循环的复杂度
// 设t(i) 表示 第i次 循环内部的时间复杂度,如果内部时间复杂度一直为O(1)
//即
t(1)= O(1)
t(2)= O(1)
.....
// 2.找出执行次数与变量i的关系,通过循环的退出条件,找出t与n关系( 他们通过i关联)
// 设t表示执行次数(t是变量,和上面的t函数没关系)
// 寻找i关于t的函数,观察表,有
i = f(t) = t
i = n // 退出条件
t = n // 内层执行一次的时间复杂度为O(1),执行t次的时间复杂度t*O(1)=>O(t), 也就是O(n)
// 3.过程
0 + O(1) + O(1) + .... O(1) //一共n项
(i=0) (i=1) (i=2) .... (i=n)
一共t个O(1) 也就是 n * O(1) 即为O(n)
找规律:
执行次数 | i |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
… | … |
n | n |
for(int i=0; i<n; i=i+3){
// do something
}
// 1.判断内层循环的复杂度
// 设t(i) 表示 第i次 循环内部的时间复杂度,如果内部时间复杂度一直为O(1)
//即
t(1)= O(1)
t(2)= O(1)
.....
// 2.找出执行次数与变量i的关系,通过循环的退出条件,找出t与n关系( 他们通过i关联)
// 设t表示执行次数(t是变量,和上面的t函数没关系)
// 寻找i关于t的函数,观察表,有
i = f(t) = t*3
i = n // 退出条件
t*3 = n , => t=n/3 // 内层执行一次的时间复杂度为O(1),执行t次的时间复杂度t*O(1)=>O(t), 即O(n/3)
// 也就是O(n)
// 3.过程
0 + O(1) + O(1) + .... O(1) //一共n/3项
(i=0) (i=1) (i=2) .... (i=n/3)
一共t个O(1) 也就是 n/3 * O(1), 即O(n/3) 也就是O(n)
找规律:
执行次数 | i |
---|---|
0 | 0 |
1 | 3 |
2 | 6 |
3 | 9 |
n | n*3 |
情形二(累乘)
for(int i=1; i<n; i*=2){
// do something
}
// 1.判断内层循环的复杂度
// 设t(i) 表示 第i次 循环内部的时间复杂度,如果内部时间复杂度一直为O(1)
//即
t(1)= O(1)
t(2)= O(1)
.....
// 2.找出执行次数与变量i的关系,通过循环的退出条件,找出t与n关系( 他们通过i关联)
// 设t表示执行次数(t是变量,和上面的t函数没关系)
// 寻找i关于t的函数,观察表,有
i=f(t)=2的t次幂
i=n // 退出条件
2的t次幂 = n ,=> t=log(2)n ,//内层执行一次的时间复杂度为O(1), 所以时间复杂度为O(log(2)n)
//即O(log n)
0 + O(1) + O(1) + .... O(1) //一共log(2)n项
(i=0) (i=1) (i=2) .... (i=log(2)n)
一共t个O(1) 也就是 log(2)n * O(1) 即O(log(2)n) 也就是O(log n)
找规律:
执行次数 | i |
---|---|
0 | 1 |
1 | 2 |
2 | 4 |
3 | 8 |
n | 2(n) |
情形三(嵌套)
for(int i=0; i<n; i++){
for(int j=0; j<i; j++){
// do something
}
}
// 对于
for(int j=0; i<j; j++){
}
// 如果内存循环时间复杂度为O(1)
// 设t(i) 表示第i次的时间复杂度
// 时间复杂度为t(i)=i * O(1)
// 对于
for(int i=0; i<n; i++){
// 时间复杂度为t(i)=i * O(1)
}
i = f(t) = t
t = n
// 即需要执行t=n次
// 过程
0 + O(1) + (O(1) + O(1)) + (O(1) + O(1)+ O(1)) + .....
(i=0) (i=1) (i=2) (i=3) (i=n)
所以总的时间复杂度为: 总共(1+n)*n/2 个O(1) ,故时间复杂度为O(n的平方)