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