N个通信兵的问题

原题是: 

总共有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次。

这便是节约了一次通信的关键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值