【背景】
从《数据结构导论》的一开始,就有时间复杂度的介绍,在后面的学习中,每个算法几乎都会带有时间复杂度的分析,一个算法的时间性能(或时间效率)是评价算法好坏的因素之一,下面让我们来认识一下时间复杂度吧。
【定义】
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度。
【计算步骤】
1、计算出算法的基本操作的执行次数T(n)(计算量)
基本操作是指算法中的每条语句(以;号作为分割),语句的执行次数也叫做语句的频度。在做算法分析时,一般默认为考虑最坏的情况。
2、计算出T(n)的数量级
求T(n)的数量级,只要将T(n)进行这样一些操作: 忽略常量、低次幂和最高次幂的系数,令f(n)=T(n)的数量级。
3、用大O表示法来表示时间复杂度
当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。
【实例分析】
<span style="font-family:KaiTi_GB2312;font-size:18px;">int num1,num2;
for (int i =0;i<n;i++){
num1 + =1;
for(int j =1;j<=n;j * =2){
num2+=num1;
}
}</span>
分析:
1、
T(n) = 2 *1 +4*n+3* n *log2n
2、
忽略掉常量、低次幂和最高次幂的系数
f(n)= n * log2n
3、
lim(T(n)/f(n)) = (2+4n+3n*log2n) / (n*log2n)
= 2*(1/n)*(1/log2n) + 4*(1/log2n) + 3
经分析可知,当n趋向于无穷大时,1/n趋向于0,1/log2n趋向于0,所以lim(T(n)/f(n))=3,T(n) = O(n*log2n)。
所以可以认为:决定算法复杂度的是执行次数最多的语句,这里是num2+=num1,一般也是最内循环的语句。
【简化的计算步骤】
1.找到执行次数最多的语句
2.计算语句执行次数的数量级
3.用大O表示结果
根据上述算法,我们再来分析:
1. 执行次数最多的语句为num2+=num1 ;
2. T(n)= n*log2n ; f(n)= n*log2n ;
3. lim(T(n)/f(n)) = 1; T(n)= O(n*log2n);
【经验汇总】
复杂度与时间效率的关系:
c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一个常量)
|--------------------------|--------------------------|-------------|
较好 一般 较差
其中c是一个常量,如果一个算法的复杂度为c 、 log2n 、n 、 n*log2n,那么这个算法时间效率比较高 ,如果是 2n , 3n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。
【更多例子】
1、O(1)
---------交换i和j的内容
temp=i;
i=j;
j=temp;
分析:
以上三条单个语句的频度为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
2、O(n)
a=0;
b=1; ①
for (i=1;i<=n;i++) ②
{
s=a+b; ③
b=a; ④
a=s; ⑤
}
分析:
语句1的频度:2,
语句2的频度:n,
语句3的频度:n,
语句4的频度:n,
语句5的频度:n,
T(n) = 2+4n f(n) = n
lim(T(n)/f(n)) = 2*(1/n) + 4 = 4
T(n) = O(n).
3、O(log2n)
i=1; ①
while (i<=n)
i=i*2; ②
分析:语句1的频度是1, 设语句2的频度是t, 则:nt<=n; t<=log2,考虑最坏情况,取最大值t=log2n,
T(n) = 1 + log2n,f(n) = log2n
lim(T(n)/f(n)) = 1/log2n + 1 = 1
T(n) = O(log2n)
4、O(n2) -------(冒泡、直接选择排序算法)
【总结】
以前觉得时间复杂度很难学,现在看来只有真正去做了,才发现其实并没有想象中的那么难。先去了解,慢慢发现它的简单和有趣~~啦啦