【阿里2013实习笔试】n个战士最少通话次数知道全局战况

题目

战报交流:战场上不同的位置有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步

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值