题目
战报交流:战场上不同的位置有N个战士(n>4),每个战士知道当前的一些战况,现在需要这n个战士通过通话交流,互相传达自己知道的战况信息,每次通话,可以让通话的双方知道对方的所有情报,设计算法,使用最少的通话次数,使得战场上的n个士兵知道所有的战况信息,不需要写程序代码,得出最少的通话次数。
解题思路
解该题需要两步:
1. 汇聚:收集全局信息,集中到一个中心点(实际是两个)
2. 分发:剩余所有的节点和中心点通话一次,则每个节点都有知道了全局信息
第一步
基本思想是分组通话(有点divide-conquer的思想)
方法一
a1 a2 ... an,所有节点都与a1通话,最终a1 an带有全局信息,比较次数n-1
方法二
两两分组,每组再选一个代表进入下一轮;下一轮同样两两分组……二叉树结构
假设最后也是a1 an带有全局信息
比较次数n/2 + n/4 + n/8 + ... + n/n = n-1次
不管怎么分组比较,最少要n-1次(不知道怎么证明……)
第二步
第一步中有两个点a1 an具有全局信息,剩下n-2个节点都只有部分信息
则再进行n-2次通信(和a1/an),所有节点都具有全局信息了
总步数 (n-1) + (n-2) = 2n-3
但是2n-3是最少步数吗?
我们举个例子,n=4
2n-3 = 5步
实际过程:(a1, a2) (a3, a4) (a1, a4) (a2, a3)
注意到只需要4步就可以了
最后一步不用(a2, a1) (a3, a1)
我们返回去看第一步汇聚的过程
第一步的最后一个过程,有两个cluster {a1 ai...} {an aj ...}
假设a1 ai 具有cluster1的所有信息,an aj具有cluster2的所有信息
最终我们a1 an通信,这两个节点具有全局信息
第二步分发中
ai aj不需要分别和a1/an通信,而只需要(ai aj)通信,减少一次通话
第二大步,最少需要n-3步
故,总共最少需要2n-4步