算法是解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令表示一个或者多个操作。
1. 算法的特性
- 输入
- 输出
- 有穷性
- 确定性
- 可行性
2. 算法设计的要求
- 正确性
- 可读性
- 健壮性
- 时间效率高和储存量低
3. 算法效率的度量方法
- 事后统计方法
- 事前分析估计方法
通过书中所给1+2+...+99+100的例子,可以明显对比出几种不同算法具有不同的空间和时间开销。某个算法随着n增大,会越来越优于另一算法,或者越来越差于另一算法。这里就可以体现出,算法本身的复杂度是时刻变化的,那么如何量化衡量这种复杂度呢?算法时间复杂度的定义是,语句总的执行次数T(n)是关于问题规模n的函数,而分析T(n)的变化情况并确定T(n)的数量级。算法时间复杂度,也就是算法的时间量度,记作:T(n) = O(f(n)) 它表示随着问题规模的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,称为时间复杂度。一般都用大写的O来表示。推导大O阶的基本流程:
推导大O阶:
1. 用常数1取代运行时间中的所有加法常数
2. 在修改后的运行次数函数中,只保留最高阶项
3. 如果最高阶项存在且不是1,则去除与这个项相乘的常数,得到的结果就是大O阶
复杂度名称 | 大O记号 |
常数阶 | O (1) |
线性阶 | O (n) |
对数阶 | O (logn) |
平方阶 | O () |
nlogn | O (nlogn) |
立方阶 | O () |
指数阶 | O () |
常用算法复杂度顺序从小到大:
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(2^n) < O(n!) < O(n^n)