一道阿里笔试题


战报交流:战场上不同的位置有N个战士(n>4),每个战士知道当前的一些战况,现在需要这n个战士通过通话交流,互相传达自己知道的战况信息,每次通话,可以让通话的双方知道对方的所有情报,设计算法,使用最少的通话次数,使得战场上的n个士兵知道所有的战况信息,不需要写程序代码,得出最少的通话次数。
我能想到的最少通话次数等于2n-4,不知正解为多少
算法该如何设计


a,b,c,d,e.通话
a--b,b--c;d--e;b--d;c--e;a--(b or c or d or e)。 6次通信
通过分组(a,b,c;d,e),每组进行通信,每组中有两人掌握了组内所有信息,两组中两人分别交换信息,可以比2n-3少一次。
所以可以通过分组,减少通信次数。


我觉得即便求出最少值,算法也未必好实施。 容易实现的算法就是一个中心节点,2n-3次通信。

面试题 算法

蠢得跟个蛋一样 11 years, 7 months ago

|| 说明: 为了讲得更详细,下面说得比较啰嗦。

先思考这么个问题:

有a个node的cluster1和b个node的cluster2.(a>=2,b>=2) 如何连接使得cluster1,cluster2的node拥有cluster1和cluster2的全部信息?

1) 对于cluster1,必须存在一个状态,即至少有1个node拥有cluster1的全部信息,因为我们的目的是拥有cluster1和cluster2的全部信息。 此时至少需要a-1次连接,即单链,此时有且仅有2个node拥有全部信息。额外的a-2个node都不需要知道cluster1全部信息,因为如果要知道就需要1次连接,但由于它还需要是知道cluster2的信息,因而还需要1次。后面我们发现这是多余的。


 A_1 ->A_2->A_3....->A_{a-1} -> A_a  //A_{a-1},和A_a拥有A_1,A_2,A_3,..A_a的全部信息。

2) 对于cluster2也一样,至少需要b-1次连接使得B {b-1}和B b拥有B 1,B 2,...B {b-1},B b的全部信息。额外的b-2个node都不需要知道cluster2全部信息

3) 当cluster1和cluster2连接时,我们希望所有node都拥有全部信息。只有且仅有A {a-1},A a与B {b-1},B b连接一次,才能使得有node具有cluster1和cluster2的全部信息。当有一个node具有全部信息时,它与其他任何node1次连接就能使该node得到全部信息,这也是为什么上面说多余。

A {a-1} 与B {b-1} , A a与B b (或A {a-1}与B b, A a 与B {b-1})共两次连接,使得这4个node拥有全部信息。

除了这4个node外,其他node相互连接都无法得到全部信息。

这4个node与,其他node 通过一次连接使得该node 具有全部信息。

///////////////////////////////////////////////////////////////////////

  1. 分成两组:1) 2个node,2) n-2个node ;
  2. 2个node需要连接1次,使得2个node拥有2个节点信息;
  3. n-2个node至少需要n-3次连接,使得最后连接的2个node拥有这n-2个node的信息;
  4. 第一组的2个node与第n-2组的最后两个node(即获得该组全部信息的2个nodes)分别连接; 于是4个节点得到全部信息,连接了2次。这里是为什么节约了一次连接的关键。
  5. 剩下的n-4个node都没有获得全部信息,每个node至少需要一次连接。因此至少需要n-4次连接。用拥有全部信息的其中一个node与剩下的n-4个node连接。则只需要n-4次。
  6. 得总过需要1+(n-3)+ 2 +(n-4)= 2n-4.

需要注意的是:每次连接有且仅有两个node

你或许会问 为什么分成两组。因为即使分成很多组,最终还是归结为两组的形式。

// 对于这点,有人还有些疑问,这里给出更多的说明。

假如分成3,4.5..个组。。当第k组(a个node)与第k+1组(b个node)混合一个组(cluster),至少需要的连接数1次,这种情况下,有且仅有2个node具有这两个cluster的全部信息。那么这个cluster至少有(a-1)+(b-1)+1 = (a+b)-1个连接,这与一个cluster的情况完全一致。

补充: y= 2n-4; 还可以使用数学归纳法证明。

k=4时,至少需要4次。4=2*4-4(自己画图试试吧);

...

设k=n,y=2n-4;

k=n+1时,将信息传递过程分成两个阶段:1)收集所有node信息。2)收集完之后,分发给信息不全的node。收集第n+1个node的信息时1次,在分发全部时1个,共2个。得y = 2n -4 +2= 2(n+1)-4;

hankcs answered 11 years, 7 months ago

Your Answer