目录
1. 度量算法执行时间的方法
1.1 事后统计法
存在的问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。
1.2 事前估算法
通过分析某个算法的时间复杂度来判断哪个算法更优。
2. 时间频度
一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。
3. 时间复杂度介绍
一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
T(n)不同,但时间复杂度可能相同。如:T(n)=n²+7n+6与T(n)=3n²+2n+2, T(n)不同,但时间复杂度相同,都为O(n²)。
4. 计算时间复杂度的方法
(1)忽略常数项 T(n)=3n²+2n+2 => T(n)=3n²+2n
如:2n+20和3n+10,随着n变大,20和10这样的常数项可以被忽略。
(3)忽略低次项 T(n)=3n²+2n => T(n)=3n²
如:2n2+3n和n2+5n,随着n变大,n2快速增加,3n和5n这样的低次项增长太慢,可以被忽略。
(4)忽略系数 T(n)=3n² => T(n)=n² => O(n²)
如:5n2和3n2,随着n变大,两个数的曲线差距减小,5和3这样的系数可以被忽略。
5. 常见的时间复杂度
(按时间复杂度从低到高)
(1)随着问题规模 n 的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
(2)应该尽可能避免使用指数阶的算法,同时尽可能使用常数阶的算法。
6. 平均时间复杂度和最坏时间复杂度(附表格)
(1)平均时间复杂度,是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。
(2)最坏情况下的时间复杂度称为最坏时间复杂度。一般讨论的时间复杂度均是最坏情况下的时间复杂度。最坏情况下的时间复杂度是算法在任何输入实例上运行时间的界限,保证了算法的运行时间不会比最坏情况更长。
(3)平均时间复杂度和最坏时间复杂度是否一致,和算法有关。
排序法 | 是否原地排序 | 是否稳定 | 最好、最坏、平均时间复杂度 | 空间复杂度 | 是否基于比较 |
冒泡 | 是 | 是 | O(n)、O(n^2)、O(n^2) | O(1) | 是 |
插入 | 是 | 是 | O(n)、O(n^2)、O(n^2) | O(1) | 是 |
选择 | 是 | 否 | O(n^2)、O(n2)、O(n2) | O(1) | 是 |
希尔 | 是 | 否 | O(n)、O(n2)、O(n1.3) | O(1) | 是 |
快速 | 是 | 否 | O(nlogn)、O(n^2)、O(nlogn) | O(logn)~O(n) | 是 |
归并 | 否 | 是 | O(nlogn)、O(nlogn)、O(nlogn) | O(n) | 是 |
计数 | 否 | 是 | O(n+k)、O(n+k)、O(n+k),k是数据范围 | O(n+k) | 否 |
桶 | 否 | 是 | O(n)、O(n)、O(n) | O(N+M),N表示待排数据个数,M表示桶个数 | 否 |
基数 | 否 | 是 | O(nk)、O(nk)、O(n*k),k是维度 | O(n+k) | 否 |
堆 | 是 | 否 | O(nlogn)、O(nlogn)、O(nlogn) | O(1) | 是 |