主要内容:
介绍研究算法效率的通用框架
- 介绍三种符号: O(读作O),Ω(读作omega),和Θ(读作theta).这些数学借来的符号已经成为讨论算法效率的特定语言
- 使用通用框架系统对非递归算法进行分析.这种分析主要的工具是先定义一个代表算法运行时间的求和表达式,然后使用标准的求和法则对表达式进行化简
- 使用通用架构系统对递归算法进行分析.在这里主要分析工具不是求和,而是一种称之为递推关系的特殊等式,我们会告诉大家如何建立这种递推关系,然后对其介绍一种求解方法.
- 对斐波那契数列进行分析
分析框架
我们即将描述一个分析算法效率的一般性框架.首先必须支出有两种算法效率:时间效率(time complexity)和空间效率(space complexity).时间效率也称之为时间复杂度,指出正在讨论的算法运行的有多快;空间效率也称空间复杂度,关心算法需要的额外空间.如今额外的空间问题已经不是我们重点关注的问题.对于大多数问题来说,我们在速度上取得的进展远远大于空间上的进展
-
输入规模的度量
几乎所有的算法对规模更大的输入都需要运行更长的时间.例如,需要更多的时间来对更长的数组排序,更大的矩阵相乘也需要花费更多的时间.所以在研究算法效率的时候把它当做一个以算法输入规模n为参数的函数是非常合乎逻辑的.在大多数情况下,选择什么参数是一目了然的.例如对于排序,查找,寻找列表的最小元素以及其他与列表有关的问题来说买这个参数就是列表的长度.对一个n次多项式
的求值问题来说,这个参数是多项式的次数,或者说是他系数的个数,系数的个数比次数大一 -
运行时间的度量单位
掌握一下规律,我们不难发现一个算法中的基本操作:它通常是算法最内层循环中最费时的操作.例如,大多数排序算法是通过比较列表中的待排序元素来工作的.对于这种算法来说基本操作就是对键的比较.再举一个例子,求解数学问题的算法一般会设计四则运算:加减乘除,其中耗时最大的是除法,其次是乘法,最后是加减法.
这样我们建立起了一个算法时间效率的分下框架.他提出,对于输入规模n的算法,我们可以统计他的基本操作执行次数,对其效率进行度量.我们接下来将介绍递归算法和非递归算法的执行次数.
我们介绍该框架的一个重要应用
C(n)是基本操作的执行次数 -
增长次数
表中数字的数量级对于算法的分析具有深远意义.这些函数中增长最慢的是对数函数.实际上他的增长如此之慢,以至于我们认为:如果一个程序的算法具有对数级的基本操作次数,改程序对于任何实际规模的输入几乎都会在瞬间完成.还要注意虽然特定的操作次数会明显依赖对数的底,但是一下方程
允许他在不同的底之间转换,仅对对数部分以外的新增一个乘法常量.这就是为什么我们仅对函数的增长次数以及其常数感兴趣时,要忽略常数的底,简写为log n.
在效率的另一端是幂函数2的n次方和阶乘函数n!,一个需要记住的要点是:
一个需要指数级操作次数的算法只能用来解决规模非常小的问题
我们还可以用另一种方式
4. 算法最优,最差和平均效率
一个算法的最差效率(worst-case efficiency)是指当输入规模为n的情况下在最坏情况下的效率.这时,相对于其他规模为n的输入,该算法运行时间最长.
通过确定算法运行时间上界,分析最坏情况下为我们提供了算法效率的一个非常重要的信息.
对于规模为n的算法来说,算法的运行时间不会超过最坏输入情况下的运行时间Cworst(n)
一个算法的最优效率(best-case efficiency)是指输入规模为n时算法在最优情况下的效率.对于顺序查找,Cbest(n)=1
平均效率是随机输入
5. 分析框架概要
渐进符号和基本效率类型
- O(g(n))是增长次数小于等于g(n)(及其常数倍,n趋向于无穷大)的函数集
- Ω(g(n))是增长次数大于等于g(n)(及其常数倍,n趋向于无穷大)的函数集
- Θ(g(n))是增长次数等于g(n)(及其常数倍,n趋向于无穷大)的函数集
- 符号O
2. 符号Ω
3. 符号Θ
4. 渐进符号的有用特性
5. 基本的渐进效率类型
非递归算法的数学分析
- 分析非递归算法效率的通用方案
- 算法分析常用的求和公式和法则
递归算法的数学分析
- 通用方案
计算第n个斐波那契数
算法经验分析