博客内容主要是以 北京大学 屈婉玲老师的 MOOC 视频来写的。视频共是十周的内容,我决定用五篇博客完成。
温馨提示:这个课程不仅适用于 算法设计与分析 的学习,也非常适用于 数学建模 的学习,如果是学习 数学建模的基础部分,前两周的内容是非常适合的,如果要进一步学习 建模思想,建议把这十周视频好好看一遍。( •̀ ω •́ )y
我们还是先来看一下这十周视频的思维导图:
在这篇博客中写的是三、四周的内容:分治策略。
第三周
分治策略的基本思想
1.将原始问题划分或者归结为规模较小的子问题。
2.递归或迭代求解每个子问题。
3.将子问题的解综合得到原问题的解。
注意:
1.子问题与原始问题性质完全一样。
2.子问题之间可彼此独立地求解。
3.递归停止时子问题可直接求解。
例子
1.二分检索
2.二分归并排序
3.Hanoi 塔
通过上面的例子展示分治算法的特点:
(1)将原问题归约为规模小的子问题,子问题与原问题具有相同的性质。
(2)子问题规模足够小时可直接求解。
(3)算法可以递归也可以迭代实现。
(4)算法的分析方法:递推方程。
分治算法的设计要点
1.原问题可以划分或者归约为规模较小的子问题。
(1)子问题与原问题具有相同的性质
(2)子问题的求解彼此独立
(3)划分时子问题的规模尽可能均衡
2.子问题规模足够小时可直接求解。
3.子问题的解综合得到原问题的解。
4.算法实现:递归或迭代。
两类常见递推方程的求解
方程2 这种形式的解就会很简单,
我们可以直接使用这些个结果直接把复杂度函数直接算出来。
芯片测试
请查看 芯片测试的分析(蛮力+分治)
快速排序
基本思想:
用首元素 x 作划分标准,将输入数组 A 划分成不超过x的元素构成的数组 A1,大于x的元素构成的数组 A2 。
递归地对子问题 A1,和 A2 进行排序,直到子问题规模为1时停止。
时间复杂度:
幂乘算法及应用
改进分治算法
途径1:减少子问题数
依据:
例题:
整数位乘问题、矩阵相乘问题
小结:
途径2:增加预处理
例题:平面点对问题
小结:
第四周
选择问题
可查看 选择问题的算法(详细版)
卷积及应用
卷积的定义:
卷积与多项式乘法的关系:
卷积的应用——信号平滑处理:
卷积计算
蛮力算法:
蛮力算法的时间:O(n^2)
快速傅立叶变换 FFT 算法:
确定 x 的取值:1的 2n 次根
关键步骤:多项式对 x 求值
快速傅立叶变换FFT算法
多项式求值算法:
蛮力算法:O(n^3)
改进的求值算法(秦九韶算法):O(n^2)
分治多项式求值算法(FFT算法):O(nlogn)
FFT 算法的设计与分析:
平面点集的凸包
三四周小结:
分治算法设计:
将原问题归约为子问题,
直接划分注意尽量均衡,通过计算归约为特殊的子问题,
子问题与原问题具有相同的性质,
子问题之间独立计算。
算法实现:
递归或迭代实现,
注意递归执行的边界
时间复杂度分析:
给出关于时间复杂度函数的递推方程和初值,求解方程。
提高效率的途径:
减少子问题个数
进行预处理
重要的分治算法:
检索算法:二分检索
排序算法:快速排序、二分归并排序
选择算法
快速傅立叶变换 FFT 算法
平面点集的凸包