您的位置:首页 > 其它

阿里题目:士兵的军事秘密传递

2013-05-24 19:40 183 查看
有n个士兵,每个士兵知道不同的军事秘密,每两个士兵可以通过一次交流来互相知晓对方掌握的信息,现设计最优的策略来使得通过最少的交流次数使所有士兵知道所有军事秘密,并给出最优策略所需的交流次数。(给出算法思路,计算次数)

网络思路:

使用归并法,设前n/2个士兵组成的集合A互相知晓集合内所有士兵的秘密,不知道其他任意士兵的秘密,后n/2个士兵组成的集合B也只知道自己集合内部的所有秘密。从集合A中取一个士兵a,从集合B中取一个士兵b,让a、b互相交流之后,则a、b知道了所有的军事秘密,经过n/2次上述操作后,算法完成。对于集合A内部的士兵,用同样的方法分为两个小集合进行同样的操作。基本操作和归并排序类似。所以其算法复杂度也与归并排序相同为O(nlogn),士兵交流的次数为nlogn/2不知道还有没有更优算法。

自认为其是最优的,沿袭这个思路,可以得出有用的东西:

1、某一时刻,出现集合A和集合B,其分别知道自己集合内部的所以秘密(分析中有),不妨设集合A中元素为n个,集合B中元素为m个;

2、要两个集合交换信息,假设集合A内部交换信息所需要的代价为Tn,集合B的为Tm,这样使AB集合中所有人知道秘密信息可以通过m+n次(从集合A中取一个士兵a,从集合B中取一个士兵b,让a、b互相交流之后,则a、b知道了所有的军事秘密,由a或b告知所有的人),但是这显然不是最优的方案。关键就在于a或b告知其他人的时候,其他也知道一些信息,而这些信息a或b可能有再次告诉他,冗余就在这里。如果我们可以他们互相告知的时候,基本上都是自己不知道的信息,那就可以减少交换的次数了。

所以我们可以这么做,每次交换信息的都是两个集合中不同的人。如A{1,3},B{2,4,5},1和2交换,3和4交换,5和A中其中一个交换就可以了。这样最优次数为:min(n,m)+|n-m| = max(n,m), 所以本次的代价为:

    Tm+n = Tn + Tm + max(n,m)

而max(n, m)的最小值就是ceil((m+n)/2)+1 (ceil下界), Tn、Tm要达到最小,递归方式,Tn,Tm也分别分为两个集合,计算最优。问题就类似于最优树,每个数相当于权值(相等的)为1的子叶。

所以其算法复杂度也与归并排序相同为O(nlogn)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: