1. 算法的时间复杂度
度量一个程序的(算法)执行时间的两种方法
1. 事后统计的方法:实际跑程序,看用了多长时间。
2. 事前估算的方法:通过分析某种算法的时间复杂度来判断。
2. 时间频度
时间频度:一个算法花费的时间与算法中语句执行的次数成正比。一个算法中语句执行的次数称为语句频度或者时间频度。 记 为: T(n)。
例如:
计算1--100所有的数字之和,一下有两种算法:
int total =0;
int end=100;
for(i=0;i<=end;i++){
total+=i;
}
时间频度 T(n)=n+1
int total=0;
int end=100;
total=(1+end)*end/2
时间频度 T(n)=1
时间频度计算的三个原则:
1. 忽略常数项
例: 2*n +10 与 2*n 随着 n 的增大,10可以忽略。
2. 忽略低次项
例:2n^2+3n与2n^2 随着 n 的增大,3n可以忽略。
3.忽略系数
5n^2 与 3n^2 随着 n 的增大,5和3可以忽略。但是需要注意次数的多少。次数大了也不可忽略。
3. 时间复杂度
(1) 通常,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若某个辅助函数f(n),使得当n曲线与无穷大时,T(n)/f(n) 的极限值为不等于0的常数,就称f(n)为T(n) 的同数量级函数。记:T(n)=O(f(n)) ,称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
(2)T(n)不同,但是时间复杂度可能是相同的。如:T(n)=n^2+7n+6与T(n)=3n^2+2n+2 这两个的T(n)不同,但是时间复杂度相同都为O(n^2)。
(3)计算算法时间复杂度的方法
用常数1代表常数项: T(n)=3n^2+2n+2 ----> T(n)=3n^2+2n+1
修改后运行次数函数中,只保留最高阶项: T(n)=3n^2+2n+1 ------> T(n)=3n^2
去除最高阶项的次数 T(n)=3n^2 -----> T(n)=n^2 ===>O(n^2)
4. 常见的是时间复杂度
(1) 常数阶 O(1) :不论代码执行了多少行,只要没有循环的复杂结构,代码的时间复杂度就是 O(1)
(2)对数阶 O(log2n)
(3)线性阶 O(n)
(4)线性对数阶 O(nlog2n)
(5) 平方阶 O(n^2)
(6) 立方阶 O(n^3)
(7) K 次方阶 O (n^k)
(8) 指数阶 O(2^n)
5. 平均时间复杂度和最坏时间复杂度
(1)平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。
(2)最坏情况下的时间复杂度称为最坏时间复杂度,一般我们讨论的都是最坏时间复杂度,原因是在最坏的情况下的时间复杂的是算法在任何束缚实例下上运行的时间界限,这就保证了算法的运行时间不会比最坏的情况还长。
(3)平均时间复杂度和最坏时间复杂度是否一致,和算法有关。
6. 空间复杂度
(1)一个算法的空间复杂度定义为该算法索要耗费的存储空间,也是问题规模n的函数。
(2)空间复杂度是一个算法在运行过程中临时占用空间大小的度量。