分治法
2.1 乘法
截止第二章 2.1,乘法可以被认为是一个 的算法。
2.2 递推式
主定理 对于常数 和 ,若 ,则
2.3 归并排序
归并排序的时间复杂度为 。 伪代码如下:
function mergesort(a[1...n])
Input: an array a[1...n] of n numbers
Output: a[1...n] sorted in nondecreasing order
if n > 1:
return merge(mergesort(a[1...⌊n/2⌋]), mergesort(a[⌊n/2⌋+1...n]))))
else:
return a
function merge(x[1...p], y[1...q])
if p = 0: return y[1...q]
if q = 0: return x[1...p]
if x[1] ≤ y[1]:
return [x[1]] + merge(x[2...p], y[1...q])
else:
return [y[1]] + merge(x[1...p], y[2...q])
2.4 寻找中项
寻找中项的时间复杂度为 。
伪代码如下:
function median(a[1...n])
Input: an array a[1...n] of n numbers
Output: the median of a[1...n]
if n = 1: return a[1]
choose a pivot p from a[1...n]
let L = {x ∈ a[1...n] | x < p}
let E = {x ∈ a[1...n] | x = p}
let G = {x ∈ a[1...n] | x > p}
if |L| ≥ ⌈n/2⌉: return median(L)
else if |L| + |E| ≥ ⌈n/2⌉: return p
else: return median(G)
2.5 矩阵乘法
矩阵乘法的时间复杂度为 。
首先将 矩阵 和 分成四个子矩阵:
然后计算以下七个矩阵:
最后将结果组合成矩阵 :
其中:
2.6 FFT
快速傅里叶变换(FFT)的时间复杂度为 。
离散傅里叶变换
其中 为 次单位根,。
2.6.1 从系数表示法到点表示法(DFT)
DFT,对于 次多项式 ,总可以根据 来进行划分:
由单位根的性质,,所以
这就将规模减半了。
2.6.2 快速傅里叶变换
两个多项式 和 的乘积 可以通过以下步骤计算:
