【发布时间】:2018-01-17 09:40:29
【问题描述】:
所以我尝试解决以下任务:
开发一个 CREW PRAM 算法来计算整数序列 x_1,x_2,...x_n 的奇数。
n 是处理器的数量 - 复杂度应该是 O(log n) 并且 log_2 n 是自然数
到目前为止我的解决方案:
Input: A:={x_1,x_2,...,x_n} Output:=oddCount
begin
1. global_read(A(n),a)
2. if(a mod 2 != 0) then
oddCount += 1
问题是,由于 CREW 我不允许同时使用多个写入指令oddCount += 1 正在读取oddCount 然后写入oddCount + 1,所以会有多个写入。
我必须做这样的事情吗
Input: A:={x_1,x_2,...,x_n} Output:=oddCount
begin
1. global_read(A(n),a)
2. if(a mod 2 != 0) then
global_write(1, B(n))
3. if(n = A.length - 1) then
for i = 0 to B.length do
oddCount += B(i)
那么首先每个进程确定它是奇数还是偶数,最后一个进程计算总和?但这将如何影响复杂性,是否有更好的解决方案?
感谢 libik,我得到了这个解决方案:(n 以 0 开头)
Input: A:={x_1,x_2,...,x_n} Output:=A(0):=number off odd numbers
begin
1. if(A(n) mod 2 != 0) then
A(n) = 1
else
A(n) = 0
2. for i = 1 to log_2(n) do
if (n*(2^i)+2^(i-1) < A.length)
A(n*(2^i)) += A(n*(2^i) + (2^(i-1)))
end
i = 1 --> A(n * 2): 0 2 4 6 8 10 ... A(n*2 + 2^0): 1 3 5 7 ...
i = 2 --> A(n * 4): 0 4 8 12 16 ... A(n*4 + 2^1): 2 6 10 14 18 ...
i = 3 --> A(n * 8): 0 8 16 24 32 ... A(n*8 + 2^2): 4 12 20 28 36 ...
所以第一个 if 是第 1 步,for 代表 log_2(n)-1 步,所以所有的都有 log_2(n) 步。解应该在 A(0) 中。
【问题讨论】:
标签: algorithm parallel-processing big-o complexity-theory