2 算法效率
算法效率
目录
- 算法效率的度量
- 函数的渐进的界
- 算法的基本复杂性类型
- 算法复杂性分析的基本方法
- 非递归算法的复杂性分析
- 递归算法的复杂性分析
- 递归算法与非递归算法比较
- 经验分析方法
- 算法可视化
1 算法效率的度量
分类
- 时间复杂度
- 空间复杂度
算法效率的表示
N-要解决问题的规模
I-算法的输入
A-算法本身
C-算法复杂性
S-空间复杂性
T-时间复杂性
$$
C = F(N, I, A)\
T = T(N, I)\
S = S(N, I)\
$$
算法效率的界
包含最大时间效率、最小时间效率、平均时间效率。
2 函数的渐进的界
函数的界定义
设f 和g 是定义域为自然数集N上的函数
- $f(n)=O(g(n))$渐进上界
若存在正数$c$和$n0$使得对一切$n≥n0有0≤f(n)≤cg(n)$ - $f(n)= Ω(g(n))$渐进下届
若存在正数$c$和$n0$使得对一切$n≥n0有0≤cg(n)≤ f(n)$ - $f(n)=o(g(n))$不可达上届
对任意正数$c$存在$n0$使得对一切$n≥n0$有$0≤f(n)<cg(n)$ - $f(n)=ω(g(n))$不可达下界
对任意正数$c$存在$n0$使得对一切$n≥n0有0≤cg(n)<f(n)$ - $f(n)=Θ(g(n)) ⇔ f(n)=O(g(n))$ 且$f(n)=Ω(g(n))$紧渐进界
- $O(1)$表示常数函数
函数界的基本性质1

函数界的基本性质2
设f , g, h 是定义域为自然数集N上的函数:
- 如果f =O(g)且g=O(h),那么f =O(h).
- 如果 f =Ω(g)且g=Ω(h),那么f =Ω(h).
- 如果f =Θ(g)和g=Θ(h),那么f =Θ(h).
- O(f(n))+O(g(n)) = O(max{f(n),g(n)})
- O(f(n))+O(g(n)) = O(f(n)+g(n))
- O(f(n))*O(g(n)) = O(f(n)*g(n))
函数界的基本性质3
- 设f,g,h 是定义域为自然数集N上的函数,若对某个其它的函数h, 我们有f =O(h)和g=O(h),那么f+g = O(h).
- 假设f 和g是定义域为自然数集合的函数,且满足g=O(f),那么f+g=Θ(f).
常见函数的界
$$
\log_2n=o(\sqrt{n})\
\log_an=Θ(log_bn)\
\log_bn=o(n^α)\
n^α=o(b^n)\
n!=o(n^n)\
n!= ω(2^n)\
log(n!)= Θ(n\log n)
$$
3 算法的基本复杂性类型
$$
n^n>n!>a^n>n^a>n\log n>n>\sqrt{n}>\log n
$$
4 复杂性分析的基本步骤
- 决定表示输入规模的参数。
- 找出算法的基本操作。
- 检查基本操作的执行次数是否只依赖于输入规模。如果还依赖于输入的其它特性,考虑最差、平均以及最优情况下的复杂性。
- 对于非递归算法,建立算法基本操作执行次数的求和表达式;对于递归算法,建立算法基本操作执行次数的递推关系及其初始条件。
- 利用求和公式和法则建立一个操作次数的闭合公式,或者求解递推关系式,确定增长的阶。
5 非递归算法的复杂性分析
- 算法输入规模:可以用数组元素个数n度量
- 基本操作:比较与赋值两种,选择比较
- 比较操作只与输入规模相关,不用考虑最坏、平均、最好情况
- 建立基本操作执行次数求和表达式
- 确定增长的阶
6 递归算法的复杂性分析
线性收缩递归

等比收缩递归


7 递归算法与非递归算法比较
8 经验分析方法
9 算法可视化
10 常见算法算法效率总结
比较排序算法

排列问题-分治法

矩阵乘法-分治法

二分查找
O(logn)
01背包问题
动态规划O(nc)
回溯法O(2^n)
分支限界O(2^n)
投资问题动态规划O(mn2)
流水作业调度动态规划Johnson 算法O(nlogn)
最大字段和-动态规划O(n)
电路布线问题-动态规划O(n)
图像压缩问题-动态规划O(n)
最长公共子序列-动态规划O(m+n)
N后问题-回溯法O(n^n+1)
活动安排-贪心算法O(nlogn)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Estom的博客!




