并行计算总和

时间:2013-06-14 09:08:27

标签: algorithm parallel-processing

这是一个面试问题。

N个节点,每个节点由几个字段和方法组成。这些是:

// Every node has an ID. All of these IDs are sequential, and begin with 0.
//   i.e. all ids are uniquely in the range of 0 t N-1
int id;
int val; // Every node has a value
int max; // max = N. Every node knows how many nodes are in the system. 

void send(int idTo, int payload)
int recv(int idFrom) 

编写一段同时在每个节点上运行的代码,这样当它完成运行时,系统中的每个节点都知道系统中所有节点的值的总和。

2 个答案:

答案 0 :(得分:5)

您可以将值广播到每个节点,并从每个其他节点接收值。 这样每个节点都会进行添加并知道结果。虽然,我认为这可能是非常低效的。

我更喜欢上一个回答中从前一个节点接收部分和的想法,添加自己的值并将新总和传递给下一个节点。然后你必须在另一个方向传输最终结果,以便每个节点最后知道答案。

但是如果你想利用所有节点可以同时运行的事实,你可以从两端开始第一次传播并在中间得到最终结果,并从那里进行第二遍遍两个方向。这将为您节省一半的时间。更好的是,遵循相同的想法,您可以通过成对来生成总和,并将部分结果发送到第四个节点,然后发送到eigth,依此类推。这个策略只需要O(lg n)即可到达中间位置。

答案 1 :(得分:0)

一个解决方案:

每个节点将收到的总和发送到系统中的下一个节点。第一次每个节点从前一个节点接收到该号码时,它会记录下来。下次收到号码 - >它从前一个数字中减去该数字,即总和。

接收将从系统中的上一个节点接收一个号码,并为其添加自己的号码 send会将其发送到系统中的下一个节点 然后接收将等待来自前一节点的另一个输入