给定一个未排序的数组,我在一篇文章中读到 n 方处理器可用于在 O(1) 复杂度内获取数组的最大元素。谁能解释它背后的机制?
问问题
103 次
2 回答
3
算法背后的机制是基于我只能称之为肮脏的把戏。也就是说,我们允许所有处理器同时写入同一个共享内存位置。如果它们都写入相同的值,则结果被认为是明确定义的。
这可用于实现并行与和并行或运算符。例如,并行或:
result := false
for i in 0 to N-1 parallel do
if a[i] then
result := a[i]
我们还允许同时读取。
这是MAX算法:
N := a.length
for i in 0 to N-1 parallel do
m[i] := true
for i in 0 to N-1 parallel do
for j in 0 to N-1 parallel do
if a[i] < a[j] /* dirty trick: simultaneous read by many processors */
then m[i] := false /* dirty trick: many processors write to m[i] at once */
for i in 0 to N-1 parallel do
if m[i]
then max := a[i] /* dirty trick: many processors write to max at once */
return max
允许这些技巧的抽象架构称为CRCW PRAM。
于 2013-10-06T15:06:56.237 回答
0
这是 |V|ad 的回答(已删除)的后续行动,
您使用了一个额外的大小数组n
(让我们称之为 B),现在您使用n-1
处理器将任何元素a[i], i=0,...,n-1
与所有其他元素进行比较a[0],...,a[i-1],a[i+1],...,a[n-1]
,每个j={1,...,n-1}
发现找到的处理器a[0] > a[j]
将应用B[i]=B[i]+1
,此外,它将检查是否B[i]=n-1
,如果是,它将宣布元素 i 是最大元素。
于 2013-10-06T14:58:05.157 回答