我不确定如何解决这个问题。
我有一个序列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}
答案 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]