参考书目:《数据结构与算法 (java语言班)》 P25
评价算法的运行时间是通过分析在一定规模下算法的基本操作完成的,并且我们只对大规模问题的运行时间感兴趣。O、Ω、Θ分别定义了时间复杂度的上界、下界、精确阶。
计算时间复杂度,最简单的方式就是计算出所有基本操作的执行次数。但是更多的时候,这种方式过于复杂而不可取。所以不存在固定的方法,但是有一些常用的分析技术可以使用。
一、计算循环次数
- 基本步骤:
1、假设循环次数为k,计算循环总数;2、列出循环退出时以及退出前前一次循环,k与n满足的不等式;3、确定精确阶。
- 例1.1
输入:正整数n;输出:循环执行总次数;
代码:
public int function(int n){
int i=1,count = 0;
while(i<n){i = i*2;count++;}
return count;
}
分析:设循环执行了k次,i在执行循环过程中的取值为:1,2...2^k,最后一次i = 2^k,所以n满足2^(k-1)<=n<2^k,k=[logn]+1 ,从而T(n)=Θ(logn)。
- 例1.2
输入:正整数n;输出:循环执行总次数;
代码:
public int function(int n){
int i=1,count=0;
while(i<=n){
for(int j=0;j<1;j++){
count++;
}
i=i*2;
} return count;
}
分析:假设while循环执行了k次,for循环每次执行i次,而i在while循环中的变化趋势为 1,2,3,4...2^k,在第k次执行完毕之后i=2^k,所以循环的总执行次数为:
1+2+...+2^(k-1) = 2^k-1
k=[logn] + 1 (见例1.1)
故 T(n) = Θ(2^k-1)=Θ(2^([logn]+1))=Θ(n).
二、分析最高频度的基本操作:略