战报交流:战场上不同的位置有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次通信。
|| 说明: 为了讲得更详细,下面说得比较啰嗦。
先思考这么个问题:
有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次。后面我们发现这是多余的。
2) 对于cluster2也一样,至少需要b-1次连接使得B{b-1}和Bb拥有B1,B2,...B{b-1},Bb的全部信息。额外的b-2个node都不需要知道cluster2全部信息
3) 当cluster1和cluster2连接时,我们希望所有node都拥有全部信息。只有且仅有A{a-1},Aa与B{b-1},Bb连接一次,才能使得有node具有cluster1和cluster2的全部信息。当有一个node具有全部信息时,它与其他任何node1次连接就能使该node得到全部信息,这也是为什么上面说多余。
A{a-1} 与B{b-1} , Aa与Bb (或A{a-1}与Bb, Aa 与B{b-1})共两次连接,使得这4个node拥有全部信息。
除了这4个node外,其他node相互连接都无法得到全部信息。
这4个node与,其他node 通过一次连接使得该node 具有全部信息。
///////////////////////////////////////////////////////////////////////
需要注意的是:每次连接有且仅有两个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;