Outline
分治思想和递归表达式
大整数乘法
矩阵乘法的Strassen算法
快速傅里叶变化
基于分治的排序
merge-sort排序
快速排序
排序的下界问题
中位数和顺序统计量
最邻近点对
凸包
Notes
## 分治思想和递归表达式
【分治思想】算法
将一个问题分解为与原问题类似但规模更小的若干子问题,递归地解这些子问题,而后将这些子问题的解结合起来构成原问题的解。这种方法在每层递归上均包括三个步骤:编程
divide(分解):将问题划分为若干个子问题
conquer(求解):递归地解这些子问题;若子问题Size足够小,则直接解决之
Combine(组合):将子问题的解组合成原问题的解
【分治递归表达式】数组
设T(n)是Size为n的执行时间,若Size足够小,如n ≤ C (常数),则直接求解的时间为θ(1)
①设完成划分的时间为D(n)
②设分解时,划分为a个子问题,每一个子问题为原问题的1/b,则解各子问题的时间为aT(n/b)
③设组合时间C(n)
则有递归方程总结为:
T(n)=θ(1) if n
T(n)=aT(n/b)+D(n)+C(n) if n≥c
技术细节(注意):
在声明、求解递归式时,经常忽略向上取整、向下取整、边界条件
边界条件可忽略,这些细节通常只影响常数因子的大小,不改变量级。求解时,先忽略细节,而后再决定其是否重要!
## 大整数乘法
*********优化划分阶段,下降T(n)=aT(n/b) + f(n) 中的 a*********ide
这里咱们假设有两个大整数X、Y,分别设X=123四、Y=5678。如今要求X*Y的乘积,小学的算法就是把X与Y中的每一项去乘,可是这样的乘法所需的时间复杂度为O(n^2),效率低下,咱们能够尝试使用分治来解决。函数
XY = (A2n/2 + B)(C2n/2 + D)优化
= AC2n + (AD+BC)2n/2 + BDui
= AC2n + ((A-B)(D-C)+AC+BD)2n/2 + BDidea
算法分析:
首先将X和Y分红A,B,C,D
此时将X和Y的乘积转化为上述式子,把问题转化为求解式子的值
此时递归式为 T(n)=4T(n/2)+θ(n)
算法复杂度T(n)=θ(n2)
继续优化: AD+BC=(B-A)(C-D)+AC+BD
算法过程:
划分产生A,B,C,D;
计算 B-A 和 C-D;
计算 n/2 位乘法 AC、BD、(B-A)(C-D);