算法设计与分析(2)——分治策略

博客内容主要是以 北京大学 屈婉玲老师的 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 算法
平面点集的凸包

猜你喜欢

转载自blog.csdn.net/xiaobai_qian/article/details/106423001