算法概论(DPV)第2章 分治算法 总结
书籍介绍:
https://book.douban.com/subject/3155710/
配套课程:
CS170(伯克利),CS161(斯坦福)
github仓库:
https://github.com/Doraemonzzz/Algorithm-DPV
备注:图片来自于电子书中。
之前只回顾了课程习题,后续也会回顾每章重点内容,部分已经整理过的部分会给出链接,这次回顾第2章——分治算法。
第2章——分治算法
主定理
如果
那么
笔记:
乘法(Karatsuba Multiplication)
时间复杂度:
笔记:
归并排序
merge函数:
递归版本:
迭代版本:
$Q$是队列,eject从队列头部弹出元素,inject向队列尾部插入元素。
时间复杂度:
寻找中项
笔记:
(个人感觉这部分笔记比课本讲的更加详细)
矩阵乘法
笔记:
快速傅里叶变换(FFT)
普通视角
$d$次多项式可以用$d+1$个系数或者$d+1$个值表示:
- 计算:系数表示法$\rightarrow$值表示法
- 插值:值表示法$\rightarrow$系数表示法
基于值表示法的多项式乘法如下:
整个过程如下:
- 根据系数计算值
- 计算值乘积
- 恢复系数
FFT的核心是下式:
由此得到如下算法:
其中$w$是$1$的$n$次根。
时间复杂度:
FFT实现了系数到值的快速计算,即
根据之前的介绍,我们还需要值到系数的计算,那么是否存在快速的计算方法呢?事实上,我们有
这点从矩阵视角更容易解释。
矩阵视角
值和系数的对应关系为:
FFT对应的矩阵为:
所以FFT可以表示为矩阵形式:
利用线代的知识可得:
所以
FFT的矩阵解释
最后从矩阵乘法的角度解释FFT:
第一步,对矩阵的列重新排列,将偶数下标放在前$n/2$列,奇数下标放在后$n/2$列。
第二步,以$n/2$为分界线,考虑第$j$行的元素。
前$n/2$行,偶数下标:
前$n/2$行,奇数下标:
后$n/2$行,偶数下标:
后$n/2$行,奇数下标:
所以四个子矩阵都可以根据$M_{n / 2}\left(\omega^{2}\right)$计算。
整体如下:
完整算法:
电路视角
电路视角见课本。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Doraemonzzz!
评论
ValineLivere