Divide and Conquer

Merge Sort

持续将序列分成两半,直到不可再分,然后合并
image
T(n) = 2T(\frac{n}{2}) + O(n)

Counting Inversions

在一个序列中S,使i<j,如果存在第i个元素\(S_i\)大于第j个元素\(S_j\)
那么我们记这个元素对为inversion
想要找出整个序列的inversions个数,我们采用类似merge sort的方法

在下面的例子中,要找到整个序列的inversions count
那么就是蓝色的count + 绿色的count + 蓝绿构成的inversions count(combine)

image

combine的方法就在merge上修改一下即可

Closest Pair

场景

在一个点集中,找到一对点,使得他们的直线距离在所有点对中最短

算法

采用分治的思想

  1. 将整个点集,按照x坐标排序 \(O(nlogn)\)

  2. Conquer: 将点集平均分为两侧做分治,得到两边的最短距离,取更小,记为\(\delta\)
    每侧返回时返回两个副本,一个按y排序,一个按x排序
    image

  3. combine:需要计算跨中线两侧的点对的最短距离
    先用merge sort将两侧merge起来,得到一份按x排序的点集,一份按y排序的点集
    将点集(x)中与中线距离\(> \delta\)的点去掉,得到一条宽为\(2\delta\)的条带
    一种算法是,按y从小到大遍历条带内所有点,每个点和接下来(y较大)的7个点计算距离,如果距离小于\(\delta\),那么就更新\(\delta\)。证明略
    第二种算法是,按y从小到大遍历条带内所有中线左侧的点,每个点和条带内中线右侧的上两个点,下两个点计算距离。证明可看《求平面点集最近点对的一个改进算法》
    image

Karatsuba Multiplication

在没有加速乘法器的情况下,完成两个n bits数的乘法,是\(O(n^2)\)的复杂度
image

Karatsuba Multiplication提供了一个\(O(n^1.585)\)的算法
image
image

FFT and Inverse FFT

场景

多项式有两种表达形式,一种是coefficient,一种是point-value
在需要完成一些多项式运算时,不同表达形式运算速度不同
image
image

我们既想要取得coefficient的快速evaluate,也想要point-value的multiplication
所以我们通过在两种形式间转换来实现这个想法
image

FFT

FFT可以实现快速从coefficient转换成point-value
将表达式分成两部分,一部分是奇数次,一部分是偶数次
image

nth root of unity指的是
复数\(x\)属于nth root of unity,当且仅当\(x\)满足\(x^n=1\)
image

没有经过分治加速的的傅里叶变换就是DFT,DFT中选择在\(w^0, w^1, ..., w^{n-1}\)取point-value
image

而在FFT中,我们分别给odd和even terms在\(v^0, v^1, ..., v^{n-1}\)取point-value,然后进行合并
以下为算法流程
image

\(T(n) = 2T(\frac{n}{2}) + O(n)\)
算法为\(O(nlogn)\)

Inverse FFT

Inverse DFT就是这样,对point-value的value矩阵左乘一个Fourier Matrix的逆矩阵
image

Inverse FFT和FFT用了相同的策略,也是分治,将value矩阵分为奇偶两部分
然后分别做FFT,最后combine
但nth root of unity上发生了变化

以下为算法流程
image

posted @ 2022-06-15 22:31  wcvanvan  阅读(103)  评论(0)    收藏  举报