算法设计与分析:第二章总结
Posted Frozen_Guardian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法设计与分析:第二章总结相关的知识,希望对你有一定的参考价值。
主定理求解递归式的复杂度
网上的正式说法看不懂, 按照自己理解整理的,如有错误欢迎指正。
设递推式为 T ( n ) = a T ( n b ) + Θ ( n k ) , k ≥ 0 T(n)=aT(\\frac{n}{b})+\\Theta(n^k),k\\ge0 T(n)=aT(bn)+Θ(nk),k≥0 ,其中 n n n 为问题规模, a a a 为递推子问题的数量, n b \\frac{n}{b} bn 为每个子问题的规模(假设每个子问题的规模基本一样),则:
- 如果 log b a < k \\log_ba<k logba<k, T ( n ) = Θ ( n log b a ) T(n)=\\Theta(n^{\\log_ba}) T(n)=Θ(nlogba)
- 如果 log b a = k \\log_ba=k logba=k, T ( n ) = Θ ( n log b a log n ) T(n)=\\Theta(n^{\\log_ba}\\log n) T(n)=Θ(nlogbalogn)
- 如果 log b a > k \\log_ba>k logba>k, T ( n ) = Θ ( n k ) T(n)=\\Theta(n^k) T(n)=Θ(nk)
分治范例
1.二分搜索技术
适用于具有单调性的集合中,每次可以将集合规模下降为原来的一半,时间复杂度为 O ( log n ) O(\\log n) O(logn)。
具有单调性的集合简单来说就是,如果 a [ x ] a[x] a[x] 满足条件,那么 a [ x − 1 ] a[x-1] a[x−1] 一定满足条件;如果 a [ y ] a[y] a[y] 不满足条件,那么 a [ y + 1 ] a[y+1] a[y+1] 一定不满足条件。反之亦然。
2.大整数乘法
MTT中也用到了类似的方法用来降低复杂度,本质就是将一个数字用多项式表示,然后用多项式卷积表示原式,通过大量的魔改后降低数乘的次数从而达到降低复杂度的目的。
简单来说如果需要计算
X
∗
Y
X*Y
X∗Y:
X
=
A
∗
w
+
B
X=A*w+B
X=A∗w+B
Y
=
C
∗
w
+
D
Y=C*w+D
Y=C∗w+D
那么
X
Y
=
A
C
w
2
+
A
D
w
+
B
C
w
+
B
D
XY=ACw^2+ADw+BCw+BD
XY=ACw2+ADw+BCw+BD
最终魔改成
X
Y
=
A
C
w
2
+
(
(
A
−
B
)
(
D
−
C
)
+
A
C
+
B
D
)
w
+
B
D
XY=ACw^2+((A-B)(D-C)+AC+BD)w+BD
XY=ACw2+((A−B)(D−C)+AC+BD)w+BD
当 w = 2 n 2 w=2^{\\frac n 2} w=22n 时,不难看出规模降低了一倍,利用主定理计算复杂度为 O ( n log 2 3 ) O(n^{\\log_2 3}) O(nlog23)
所以为什么不用简单粗暴的FFT呢,明明FFT也是分治呀
十进制的数字不难拆成一个 x = 10 x=10 x=10 的多项式,即 123 = 3 + 2 ∗ 10 + 1 ∗ 1 0 2 123=3+2*10+1*10^2 123=3+2∗10+1∗102,所以两个整数相乘可以视为两个多项式相乘,利用 FFT 加速可以做到 O ( n log n ) O(n\\log n) O(nlogn) 的复杂度。
3.Strassen矩阵乘法
原来这就是去年从zx学长那里听闻的 O ( n 2.81 ) O(n^{2.81}) O(n2.81) 矩阵乘法
本质上和大整数乘法的优化思路一致,也是先分治,然后魔改降低矩阵相乘的次数。
4.棋盘覆盖
很有意思的一道题,因为原问题中有且仅有一个位置是特殊方格,而我们可以用来填充的方块刚好是三个,而矩阵边长也是二的幂次,所以一系列数字都引导我们将原问题划分为四个子问题。
划分出来的四个子问题可以简单分为两种,一种是原本就包含特殊方块的子问题,还有一种就是并不包含特殊方块的子问题。所以我们不妨将第二种子问题拼接的位置都扣去,填上一个 “L” 形骨牌,并将其标记为特殊方块,于是问题得以划分。
5.合并排序
6.快速排序
7.选择问题求第k小
8.最近点对问题
9.循环赛日程表
以上是关于算法设计与分析:第二章总结的主要内容,如果未能解决你的问题,请参考以下文章