本文主要介绍数据结构中时间复杂度如何计算,以及思路。需要分几种情况讨论
(Ⅰ)一层循环
解题思路:①列出循环趟数t以及每轮循环i的变化值。
②找到t与i的关系
③确定循环终止条件
④算结果
【例】:
void fun(int n){
int i=1;
while(i<=n)
i=i*2;
}
【解】:
t: 0 1 2 3 ........
i: 1 2 4 8 ........
i=2^t
i=n (判断条件虽然是i<=n,但可以理解为i=n)
联立上面两个式子
得t=logn
即T(n)=O(logn)
(Ⅱ)两层循环
解题思路:①列出外层循环中i的变化值
②列出内层语句执行的次数
③求和,写结果
【例】:
int m=0,i,j;
for(i=1;i<=n;i++)
for(j=1;j<=2*i;j++)
m++;
【解法一】:
i: 1 2 3 4 ........ n
内层
执行: 2 4 6 8 ........ 2n
次数
内层次数(等差数列)求和:n(2+2n)/2=n(n+1)=n^2+n
时间复杂度即T(n)=O(n^2)
【解法二】:
对内层求和,条件作为上下限(当循环变量++时适用,因为不是++会影响到执行次数)。
即T(n)==
=2+4+...+2n=
=O(
)。
(Ⅲ)三层循环
解题思路:①列式求和。
【例】:
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=j;k++)
x++;
【解】:
分析:将每一层变量的最大遍历次数相乘。最外层是n次,中间层是i次,最内层是j次,所以是n*i*j。又因为i是1~n的范围,用放缩思想将i和j赋值为最大值n,直接秒出最后得。
基本语句x++的执行次数为T(n)==O(
)=O(
)。