1

这是一道面试题。

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) 

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

4

2 回答 2

5

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

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

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

于 2013-06-16T20:21:13.203 回答
0

一种解决方案:

每个节点将收到的总和发送给系统中的下一个节点。第一次每个节点从前一个节点接收到数字时,它会记下。下次它收到一个数字 -> 它从前一个数字中减去该数字,这就是总和。

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

于 2013-06-14T09:17:33.207 回答