鉴于EREW-PRAM模型,该模型允许我并行使用任意数量的处理器,而不会发生冲突,在读取,在写访问中都没有冲突,因此我需要找到长度为4的路径数输入节点-节点邻接矩阵A,表示有向图,我需要排除不使用不同边的路径(例如:(a,b),(b,a),(a,b),(b, a)不是有效路径)。
我有一个使用n ^ 3个处理器并在O(logn)时间计算两个给定矩阵的矩阵乘法的函数:
mult-matrix(A, A, n) => B
->为我提供了长度为2的路径。
mult-matrix(B, B, n) => C
->为我提供了长度为4的路径,但我认为它考虑的是跨越相同边缘的路径。
我尝试从C的元素中减去1,其中C的节点u与节点v双向通信,但是我不确定它是否有效。
考虑到我只需要从结果矩阵C中排除一些路径,我该如何解决这个问题?
考虑到处理器的数量限制为n ^ 3,并且在最坏的情况下,时间必须为O(logn),因此任何工作解决方案都应得到赞赏。必须使用伪Pascal语言解决这些练习,但是给出可行的解决方案,我应该可以自己编写伪代码。
答案 0 :(得分:1)
我想我在https://www.perlmonks.org/?node_id=522270找到了解决方案
使用输入矩阵A,我可以使用提供的函数来计算长度为2、3和4的路径的邻接矩阵。
为了排除重复的边缘,我必须计算矩阵C,该矩阵是通过对计算出的矩阵进行逐元素减法获得的。
C[i,j] = A4[i,j] - A3[i,j] - A2[i,j] - A[i,j]
C包含最终结果。
以下伪代码解决了使用O(n ^ 3)处理器并及时使用O(logn)的EREW-PRAM的问题。
procedure paths_length_4(A, n) // Work = O(n^3 logn)
begin
A2 := mult_matrix(A, A, n) // T=O(logn), P=O(n^3)
A3 := mult_matrix(A2, A, n) // T=O(logn), P=O(n^3)
A4 := mult_matrix(A3, A, n) // T=O(logn), P=O(n^3)
for all i,j where 1 ≤ i ≤ n, 1 ≤ j ≤ n pardo // P=O(n^2)
C[i,j] := A4[i,j] - A3[i,j] - A2[i,j] - A[i,j]
end