算法设计与分析:第二章总结

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),k0 ,其中 n n n 为问题规模, a a a 为递推子问题的数量, n b \\frac{n}{b} bn 为每个子问题的规模(假设每个子问题的规模基本一样),则:

  1. 如果 log ⁡ b a < k \\log_ba<k logba<k T ( n ) = Θ ( n log ⁡ b a ) T(n)=\\Theta(n^{\\log_ba}) T(n)=Θ(nlogba)
  2. 如果 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)
  3. 如果 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[x1] 一定满足条件;如果 a [ y ] a[y] a[y] 不满足条件,那么 a [ y + 1 ] a[y+1] a[y+1] 一定不满足条件。反之亦然。

2.大整数乘法

MTT中也用到了类似的方法用来降低复杂度,本质就是将一个数字用多项式表示,然后用多项式卷积表示原式,通过大量的魔改后降低数乘的次数从而达到降低复杂度的目的。

简单来说如果需要计算 X ∗ Y X*Y XY
X = A ∗ w + B X=A*w+B X=Aw+B Y = C ∗ w + D Y=C*w+D Y=Cw+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+((AB)(DC)+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+210+1102,所以两个整数相乘可以视为两个多项式相乘,利用 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.循环赛日程表

以上是关于算法设计与分析:第二章总结的主要内容,如果未能解决你的问题,请参考以下文章

# 20172320 《程序设计与数据结构》第一周学习总结

20162301 2017-2018-1《程序设计与数据结构》课程总结

20172311《程序设计与数据结构》第一周学习总结

《算法设计与分析》概念题总结

《算法设计与分析》--算法第二章分治感想

算法设计与分析:第一章总结