视频参考:【数据结构——时间复杂度计算】https://www.bilibili.com/video/BV13d4y1K74p?vd_source=b6379ad898bc655daa39f852409320e2
一层循环
(1)列出循环趟数t,每轮循环i的变化值
(2)找到t和i的关系
(3)找到循环终止条件
(4)联立两式,解方程
例题1:
i = n * n;
while(i != 1){
i = i / 2;
}
t | 0 | 1 | 2 | 3 | ... |
i | n^2 | n^2/2 | n^2/4 | n^2/8 | ... |
t和i的关系i = n^2/2^t
终止条件i = 1
联立 n^2/2^t = 1 => t = O(log2n)
例题2:
x = 0
while(n >= (x + 1)^2)
x = x + 1;
t | 0 | 1 | 2 | 3 | ... |
x | 0 | 1 | 2 | 3 | ... |
t = x
n = (x + 1)^2
联立 => T = O()
两层循环
(1)列出外层循环中i的变化值
(2)列出内层语句的执行次数
(3)求和,写结果
例题1:
int m = 0,i,j;
for(i = 1;i <= n;i++){
for(j = 1;j <= 2*i ;j++){
m++;
}
}
i | 1 | 2 | 3 | 4 | 5 | ... | n |
内层语句执行次数 | 2 | 4 | 6 | 8 | 10 | ... | 2n |
内层语句执行次数求和:n(2 + 2n)/2 = n(n+1)
=> T = O(n^2)
m++的执行次数为:n(n+1)
多层循环
方法一:抽象为计算三维体积
方法二:列式求和
for(i = 0;i <= n;i++)
for(j = 0;j <= i;j++)
for(k = 0;k < j;k++)
因此i,j,k相互依赖