算法设计与分析 - 基本概念与解递归方程
发布时间:
更新时间:
📚 参考书籍
计算机算法设计与分析(第5版)
ISBN编号:9787121344398

💡 有趣的发现: ISBN编号相同却有两个不同封面的书,可能是出版商重印了。
🔍 一些基本概念
计算复杂度
-
上界(Upper Bound): 算法复杂度的上界用大O表示法表示,即 O(f(n)),表示算法的运行时间不会超过 f(n) 的常数倍。
-
确界(Tight Bound): 算法复杂度的确界用Θ表示法表示,即 Θ(f(n)),表示算法的运行时间既有上界又有下界,都是 f(n) 的常数倍。
-
下界(Lower Bound): 算法复杂度的下界用Ω表示法表示,即 Ω(f(n)),表示算法的运行时间至少是 f(n) 的常数倍。
注意:一般而言,我们通常考虑最差情况的复杂度,也就是 O(f(n))。
验证复杂度公式
极限法验证
原理:通过计算 T(n) 与 f(n) 的比值极限来确定渐进复杂度。
- 若 limn→∞f(n)T(n)=0,则 T(n)=o(f(n))
- 若 limn→∞f(n)T(n)=∞,则 T(n)=ω(f(n))
- 若 limn→∞f(n)T(n)=c(c>0 为常数),则 T(n)=Θ(f(n))
验证方法:对于给定的 T(n) 和 f(n),计算 limn→∞f(n)T(n)。
例子:对于 T(n)=2n2+3n+1 和 f(n)=n2,计算极限
limn→∞n22n2+3n+1=limn→∞(2+n3+n21)=2
这是一个正常数,所以 T(n)=Θ(n2)。
提示:一般而言,我们只需要考虑最高次项的系数,除非实在是不确定才会用到这个公式。
💻 解递归方程
主定理方法
主定理(Master Theorem)是分析递归算法时间复杂度的一个强大工具,适用于形如 T(n)=aT(bn)+f(n) 的递归方程,其中:
- a≥1 是子问题的数量
- b>1 是子问题规模缩减因子
- f(n) 是分解和合并的额外工作量
主定理的三种情况:
-
若 f(n)=O(nlogba−ϵ) 对某个 ϵ>0:
- 此时 T(n)=Θ(nlogba)
-
若 f(n)=Θ(nlogbalogkn) 对某个 k≥0:
- 此时 T(n)=Θ(nlogbalogk+1n)
-
若 f(n)=Ω(nlogba+ϵ) 对某个 ϵ>0,且对某个常数 c<1 和足够大的 n 有 af(bn)≤cf(n):
- 此时 T(n)=Θ(f(n))
例子:分析归并排序 T(n)=2T(2n)+n
- 这里 a=2, b=2, f(n)=n
- 计算 nlogba=nlog22=n1=n
- 因为 f(n)=Θ(nlogba),符合情况2(k=0)
- 所以 T(n)=Θ(nlogn)
递归树方法
递归树方法是一种可视化的方式来分析递归方程。
基本步骤:
- 将递归方程表示为一棵树,根节点代表原问题
- 每个内部节点表示一个子问题,边表示递归调用
- 对每一层计算总的工作量
- 累加所有层的工作量得到总复杂度
例子:分析 T(n)=2T(n/2)+n
递归树:
- 第0层(根):工作量 = n
- 第1层:2个子问题,每个工作量 = n/2,总工作量 = 2⋅(n/2)=n
- 第2层:4个子问题,每个工作量 = n/4,总工作量 = 4⋅(n/4)=n
- …
- 第log2n层:n个子问题,每个工作量 = 1,总工作量 = n
总工作量 = n+n+...+n (log2n+1项) = Θ(nlogn)
代入法
代入法(也称为归纳法)是通过猜测解的形式,然后使用数学归纳法证明猜测是正确的。
基本步骤:
- 猜测解的形式(通常基于直觉或经验)
- 使用归纳法证明这个猜测
例子:证明 T(n)=2T(n/2)+n 的解为 T(n)=O(nlogn)
假设 T(n)≤cnlogn 对某个常数 c>0
验证:
T(n)=2T(n/2)+n≤2c(n/2)log(n/2)+n=cnlog(n/2)+n=cnlogn−cnlog2+n=cnlogn−cn+n
当 c≥1 时,T(n)≤cnlogn,假设成立。
这要没ai,写latex得累死…
留言评论