原题是:
总共有N个通信兵,各携带不同的信息。每两个通信兵之间通信一次可以知道对方所知道的信息。问最少需要多少次才能让所有的通信兵知道全部的信息。
比较容易想到的一种方法就是:先将全部信息汇总到一个人身上,再让这个人将全部信息分别告诉其他人。我们假设这个为“服务器模式”
用这种方法的话,第一次汇总耗费次数N-1,能够有2个人知道全部的信息。再分散的过程耗费次数N-2,总耗费次数为2N-3.
但是这种方法是否为最好的呢?我们可以这样尝试:
将全部的N分为m与N-m两组。假设其节点分别为1,2,...,m和m,m+1,...,N
分为三步:
1.每个组进行汇总,最后会有两个人知道自己这个组的所有信息。所花费的次数为m-1+(N-m-1)=N-2
例如:每个组人数为8,编号分别为12345678
那么,12、13、14、15、16、17、18依次通信,总耗费次数为7,1和8均知道了这个组所有信息。在第一步过后,每个组有两个人知道自己半区所有信息。这时总共将会有N-4个人不知道全部信息(这些人当作完全无知即可,我们的目的是汇总)。
2.将每个组的知道自己半区所有信息的两个人两两通信,使得这四个人可以得知全部信息,花费次数为2
3.选知道全部信息的一个人,再次告诉其它N-4个不知道信息的人,花费次数为N-4最后相加可得N-2+2+N-4=2N-4
这种方法的关键在于分组。分组之后最后的四个人刚好两两互补,能够在N次便能让4个人知道所有的信息。而如果用“服务器模式”的话,让4个人知道所有的信息需要耗费N-1+2=N+1次。
这便是节约了一次通信的关键。