Skip to content

parallel

bound running time

Work Load \(W\): total work

Depth \(D\): the depth of algorithm (how parallel the this algorithm is)

Running Time \(\frac{W}{p} \leq T_p\leq \frac{W}{p}+D\)

这个深度不好理解, 他说的是序列操作对于前面序列操作的依赖链长度

比如, \(n\) 个数线性取最大值, 每个数与 max 变量取最大, 当前第 \(i\) 步的最大值与之前 \(i-1\) 个数有依赖, 所以 \(D=O(n)\)

ranking

\(W=O(n\log n), D=O(\log n)\)

sequential

i = j = 0; 
while ( i <= n || j <= m ) {
    if ( A(i+1) < B(j+1) )
        RANK(++i, B) = j;
    else RANK(++j, A) = i;
}

++i 说明当前状态对于之前有依赖

\(W=D=O(n+m)\)

parallel ranking

先分割成 \(p=n/\log n\) 组, 取等间隔 \(p\) 个分隔点, 求出他们在另一个数组中的 ranking

使用二分, \(D=O(\log n), W=O(p\log n)=O(n)\)

再将分割出的最多 \(2p\) 组, 每组最多 \(m=O(\log n)\) 个元素

线性合并, \(D=O(m)=O(\log n), W=O(pm)=O(n)\)

max finding

binary tree

\(W=O(n),D=O(\log n)\)

comparing all pairs

\(D=O(1),W=O(n^2)\)

double-log

  1. \(\sqrt n\) 分割, 递归到底

    处理合并每层的 \(\sqrt n\) 个组, 可以用全部对比的方式

    \(D=O(1),W=O({\sqrt n}^2)=O(n)\)

    \(\therefore D(n)=D(\sqrt n)+O(1), W(n)=\sqrt n W(\sqrt n)+O(n)\)

    \(D(n)=O(\log\log n), W(n)=O(n\log\log n)\) 2. 先按 \(h=\log\log n\) 分割一步

    每一组有 \(O(h)\) 个元素, 暴力取最大值

    这里用的不是全部对比, 而是单纯依次与 max 变量比较取最大值

    由于这个操作第 \(i\) 步对前 \(i-1\) 步是有线性依赖的, 所以 \(D=W=O(h)\)

    \(n/h\) 组的总 \(W=O(h\times (n/h))\)

    再按 \(\sqrt n\) 处理这 \(n/h\)

    \(D(n)=O(h+\log\log(n/h))=O(\log\log n)\)

    \(W(n)=O(h\times(n/h)+(n/h)\log\log(n/h))=O(n)\)

random sampling

  1. 随机取出 \(n^{7/8}\) 个元素

    \(D=O(1),W=O(n^{7/8})\) 2. 分成 \(n^{3/4}\) 组, 每组 \(n^{1/8}\) 个元素

    用全对比找每组的最大值, \(D=O(1),W=O((n^{1/8})^2)=O(n^{1/4})\)

    总的 \(W=O(n^{1/4}\times n^{3/4})=O(n)\) 3. 分成 \(n^{1/2}\) 组, 每组 \(n^{1/4}\) 个元素

    用全对比找每组的最大值, \(D=O(1),W=O((n^{1/4})^2)=O(n^{1/2})\)

    总的 \(W=O(n^{1/2}\times n^{1/2})=O(n)\) 4. 最后剩下 \(n^{1/2}\) 个元素(组), 直接全对比查找

总的 \(D=O(1),W=O(n)\)