书籍介绍:

https://book.douban.com/subject/3155710/

配套课程:

CS170(伯克利),CS161(斯坦福)

github仓库:

https://github.com/Doraemonzzz/Algorithm-DPV

备注:图片来自于电子书中。

之前只回顾了课程习题,后续也会回顾每章重点内容,部分已经整理过的部分会给出链接,这次回顾第2章——分治算法。

第2章——分治算法

主定理

如果

那么

笔记:

https://doraemonzzz.com/2018/09/21/%E6%96%AF%E5%9D%A6%E7%A6%8F%E7%AE%97%E6%B3%95%E4%B8%93%E9%A1%B9%E8%AF%BE%E7%A8%8BCourse1%20week2%E5%86%85%E5%AE%B9%E5%9B%9E%E9%A1%BE/#toc-heading-5

乘法(Karatsuba Multiplication)

时间复杂度:

笔记:

https://doraemonzzz.com/2018/09/09/%E6%96%AF%E5%9D%A6%E7%A6%8F%E7%AE%97%E6%B3%95%E4%B8%93%E9%A1%B9%E8%AF%BE%E7%A8%8BCourse1%20week1%E5%86%85%E5%AE%B9%E5%9B%9E%E9%A1%BE/#toc-heading-2

归并排序

merge函数:

递归版本:

迭代版本:

$Q$是队列,eject从队列头部弹出元素,inject向队列尾部插入元素。

时间复杂度:

寻找中项

笔记:

https://doraemonzzz.com/2018/10/01/%E6%96%AF%E5%9D%A6%E7%A6%8F%E7%AE%97%E6%B3%95%E4%B8%93%E9%A1%B9%E8%AF%BE%E7%A8%8BCourse1%20week4%E5%86%85%E5%AE%B9%E5%9B%9E%E9%A1%BE/#toc-heading-2

(个人感觉这部分笔记比课本讲的更加详细)

矩阵乘法

笔记:

https://doraemonzzz.com/2018/09/21/%E6%96%AF%E5%9D%A6%E7%A6%8F%E7%AE%97%E6%B3%95%E4%B8%93%E9%A1%B9%E8%AF%BE%E7%A8%8BCourse1%20week2%E5%86%85%E5%AE%B9%E5%9B%9E%E9%A1%BE/#toc-heading-4

快速傅里叶变换(FFT)

普通视角

$d$次多项式可以用$d+1$个系数或者$d+1$个值表示:

  • 计算:系数表示法$\rightarrow$值表示法
  • 插值:值表示法$\rightarrow$系数表示法

基于值表示法的多项式乘法如下:

整个过程如下:

  1. 根据系数计算值
  2. 计算值乘积
  3. 恢复系数

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)$计算。

整体如下:

完整算法:

电路视角

电路视角见课本。