Parallel Algorithms
对于一个并行算法,
- 它的work W定义为我需要多少单位时间的操作来完成这个算法
- 它的depth D定义为最长的序列
Brent’s theorem
- A lower bound
- PW≤TP
- An upper bound
- TP≤PW+D
- 上界的证明:
- 假设每一层有Wi个,一共有D层,那么我在这一层所需要的时间是⌊PWi⌋≤PWi+1
- 把每一层加起来
- ∑1D(PWi+1)=PW+D
Prefix Sums 计算前缀和
Input: A(1),A(2),…,A(n)
Output: ∑i=1kA(k)
我们在前边有某个点的B(h,i)是它两个儿子的和,且B(h,i)=B(h−1,2i−1)+B(h−1,2i)
定义C(h,i)=∑k=1αA(k),(0,α)是node(h,i)的最右边的一个后代.通俗来说,C(h,i)就是从叶子结点的第一个一直加到它最右边一个后代
!!! note
根据定义,如果```i == 1```,则```C(h,i) = B(h,i)```
若 ``` i%2 == 0```,则```C(h,i) = C(h+1,i/2)```,即如果i是偶数,那么它和它的父节点的值一样
若``` i%2 ==1 && i != 1```,则```C(h,i) = C(h+1, (i-1)/2) + B(h,i)```,就是它的叔叔加上它自己的值
Merge两个数组
merge两个递增的数组A,B到另外一个递增数组C
为简便起见,我们假设:
- A和B的元素都是可以比较的
- n=m
- logn和lognn都是整数
对每一个element做rank
- RANK(j,A) = i,if A(i) < B(j) < A(i + 1),for 1≤i<n
- RANK(j,A) = 0,if B(j) < A(1)
- RANK(j,A) = n,if B(j) > A(n)
for Pi,1 <= i <= n pardo
C(i + RANK(i,B)) := A(i)
for Pi,1 <= i <= n pardo
C(i + RANK(i,A)) := B(i)
如果我知道了rank,那么我所用的时间是O(1),做的work是O(n+m)

Parallel Ranking
Stage 1:Partitioning
p=lognn
把A和B分成P组,每组logn个元素
- A_select(i)=A(1+(i−1)logn),for1≤i≤p
- B_select(i)=B(1+(i−1)logn),for1≤i≤p
- D=O(logn)
- W=O(plogn)=O(n)
每组有一个最小的,我们可以先找到每组中最小的那个元素的RANK,然后剩下的元素就被限定在了这个小区域内,节省work
Actual Ranking
最多2p个O(logn)的子问题
- D=O(logn)
- W=O(plogn)=O(n)
Overall: D=O(logn),W=O(plogn)=O(n)
Maximun Finding
在求和问题中,直接把“ + ”号换成max就可以
时间:logn
work:O(n)
A Doubly-logarithmic Paradigm
假设h=loglogn是整数
每n为一组
- A1=A(1),…,A(n)⇒M1∼D(n),W(n)
- A2=A(n+1),…,A(2n)⇒M2∼D(n),W(n)
- …
- An=A(n−n+1),…,A(n)⇒Mn∼D(n),W(n)
M1,M2,…,Mn⇒Amax∼D′=O(1),W′=(n)2=O(n)这里后边的近似是用的暴力算法,直接两两比较
D(n)≤D(n)+O(1),W(n)≤nW(n)+O(n)⇒D(n)=O(loglogn),W(n)=O(nloglogn)
每 h 为一组
- A1=A(1),…,A(h)⇒M1∼O(h)
- A2=A(h+1),…,A(2h)⇒M2∼O(h)
- …
- Ahn=A(n−h+1),…,A(n)⇒Mhn∼O(h)
M1,M2,…,Mn⇒Amax
D(n)=O(h+logloghn)=O(loglogn)
W(n)=O(h∗hn+hnlogloghn)=O(n)
Random Sampling
D=O(1),W=O(n)

!!! note
这个算法有很高的概率在$O(1)$的深度和$O(n)$的工作量内找到数组$A$的最大值;存在常数$c$,使得算法只有$\frac{1}{n^c}$的概率无法在这一时间复杂度内找到最大值