并行EREW后缀最小

时间:2014-03-20 17:57:05

标签: algorithm parallel-processing

enter image description here我不确定如何解决这个问题。

我有一个序列A = {x1,x2 .... xn}

问题是找到B: B = {min(x1,x2 .... xn),min(x2 .... xn),(x3,x4 .... xn)........... min(xn- 1,xn)映射XN}

我需要找到一个并行算法EREW来解决O(logn)中的问题。

到目前为止,我知道需要log(n)才能在n个元素的列表中找到最小值,并使用n / 2个处理器。 (树的深度) 但是因为我需要算法是EREW(独占读取和独占写入),每个处理器必须分别读取每个元素,这就是为什么我有一个问题要解决它..在登录..

在我附上的图片中,我正在看一个n = 8的例子。 所以我有A = {1,5,4,3,6,9,10,3} 我试图从树中获取后缀(在logn中)..但我只能获得后缀 分(A7,A8} 分{A5,A6,A7,A8} 分{A1,A2,A3,A4,A5,A6,A7,A8}

1 个答案:

答案 0 :(得分:1)

您确实可以使用二叉树来解决问题:

阶段1:构建您在问题中绘制的树。从上到下逐层进行。所有访问都是独立的,因此您可以在O(1)中处理图层。现在,您可以在每个节点中写入最小范围。

伪代码:

for i in [0..log n]:   # layer 0 = top level in your drawing
    parallel for each node in layer i:
        node.min = min(node.left.min, node.right.min)

阶段2: 从下到上处理树。在同一层中向每个节点写入其右侧所有节点的最小值。第1阶段的范围最小值可用于此。

叶子现在拥有计算各自后缀最小值所需的所有信息。

伪代码:

root.right_min = infinity
for i in [log n..1]:
    parallel for each node in layer i:
        node.right.right_min = node.right_min
        node.left.right_min = min(node.right.min, node.right_min)

B = [min(node.min, node.right_min) for each node in layer 0]