数据结构笔记(算法时间复杂度计算)

时间复杂度
一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记作 T(n) ,它是算法的问题规模 n 的函数,时间复杂度主要分析 T(n) 的数量级。算法中基本运算(最深层循环内的语句)的频度与 T(n) 同数量级,因此通常采用算法中基本运算的频度 f(n) 来分析算法的时间复杂度。因此,算法的时间复杂度可以记为:
T ( n ) = O ( f ( n ) ) T(n) = O(f(n)) T(n)=O(f(n))
O 的含义是 T(n) 的数量级,其数学定义是:T(n) 和 f(n) 是定义在正整数集合上的两个函数,则存在正常数C和 n0 ,使得当n >= n0 时,都满足 0<=T(n)<=Cf(n)

结合以上描述,从数学意义上讲,T(n) 是函数 f(n) 的下界。

对于如下程序段:

int a = n;
while (a>0){
printf("基本运算的一次执行");
a--;
}
return n;

当 n 的值大于0的时候,基本运算 “a–” 会执行 n 次,直到 n = 0 ;这时a–执行的频度 f(n) = n ;
当 n 的值小于或等于 0 的时候,基本运算 “a–” 会执行 0 次,这时 a-- 执行的频度为 f(n) = 0;

可以看到,程序基本运算的执行次数,除了和程序本身有关外,还和输入的 n 的值有关系
所以,一个程序在执行的时候,根据基本运算被执行的次数,可以将复杂度分为最坏的时间复杂度,平均的时间复杂度,最好的时间复杂度。

在分析一个程序的执行效率的时候,一般都是考虑最坏情况下的时间复杂度。还是以上面的程序段作为例子,那么该程序段的时间复杂度为 T(n) = n ;

加法规则:
T ( n ) = T 1 n + T 2 ( n ) = O ( f ( n ) ) + O ( g ( n ) ) = O ( m a x ( f ( n ) , g ( n ) ) T(n) = T_1n+T_2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)) T(n)=T1n+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))
乘法规则:
T ( n ) = T 1 ( n ) ∗ T 2 ( n ) = O ( f ( n ) ∗ O ( g ( n ) ) = O ( f ( n ) ∗ g ( n ) ) T(n) = T_1(n)*T_2(n)=O(f(n)*O(g(n))=O(f(n)*g(n)) T(n)=T1(n)T2(n)=O(f(n)O(g(n))=O(f(n)g(n))
常见的渐进时间复杂度比较:
O ( 1 ) < O ( l o g 2 n ) < O ( n ) < O ( n l o g 2 n ) < O ( n 2 ) < O ( n 3 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) < O ( n n ) O(1)<O(log_2n)<O(n)<O(nlog_2n)<O(n^2)<O(n^3)<O(n^3)<O(2^n)<O(n!)<O(n^n ) O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(n3)<O(2n)<O(n!)<O(nn)

你可能感兴趣的:(数据结构)