问题:
战场上不同的位置有N个战士(n>4),每个战士知道当前的一些战况,现在需要这n个战士通过通话交流,互相传达自己知道的战况信息,每次通话,可以让通话的双方知道对方的所有情报,设计算法,使用最少的通话次数,使得战场上的n个士兵知道所有的战况信息,不需要写程序代码,得出最少的通话次数。
解答:
若要使通话次数尽可能地少,那么通话双方所了解的信息要尽可能地互补,即能组成全部的信息。
因此考虑分治法,最小单位为2,因为2个人之间最少需要一次通信。
设N个人通信最少需要K次通信,考虑N=5和N=6时:
如上图,线上的数字表示通信的序号,在通信时,尽可能地满足信息互补,如左图中4、5两次通信,右图中5、6两次通信,都满足信息互补,而且,两个小模块在合成大模块时,总能形成4个点(图中实心点,对于N=7和N=8时亦是如此),这四个点了解新模块的所有信息,然后只需从这四个点中任选一些点与那些了解部分信息的点进行通信(图中虚线所示),即可使得所有人都了解全部信息。
N=5时,K=6;N=6时,K=8...因此考虑K=2*N-4
当N=4、5、6、7时,可人工画图计算出K=2*N-4;
当N>=8时,
- 当N为偶数时,采用分治法可得每一部分所含点都为N/2,不考虑虚线所示通信的时间,只考虑其必定在左右两部分通信完之后进行,左半部分需要通信2*(N/2)-4,右半部分也是,左右两部分通信只需将4个实心点连接即可,因此总的通信次数为2*(2*(N/2)-4) + 4 = 2*N-4;
- 当N为奇数时,同上,只不过左半部分点数为(N-1)/2,右半部分点数为(N+1)/2,2*(N-1)/2-4 + 2*(N+1)/2-4 + 4 = 2*N-4。
故N个战士最少需要2*N-4次通信。