最近看到了一个有趣的问题Gossip Problem。假如我们班有n个MM,每一个MM都有一个独家八卦消息。两个MM可以通过电话联系,一通电话将使得双方都获知到对方目前已知的全部消息。要想所有n个MM都知道所有n条八卦消息,最少需要多少通电话?
一个最简单的办法就是从n个人中选一个消息汇总人,所有n-1个人都打电话给她,她再打电话给所有人。这样总共需要2n-2通电话。其实,汇总阶段的最后一通电话和发布阶段的第一通电话可以合并为一通电话,这样的话该方案实际上只需要2n-3通电话。打电话的次数还能更少吗?给出一个最优解,并证明这个数目已经不能再少了。
显然,n=2时只需要一通电话,n=3时必须要3通电话。当n=4时,可以让AB互相通话,CD互相通话,此时每个人都知道了(包括自己的)两条消息;然后A和C通话,B和D通话,从而使得每个人都获知另外两条自己还不知道的消息。显然,对于4个人的情况,4通电话已经是最少的了。
对于n>4的情况,有一种算法可以保证在2n-4通电话内解决问题。首先,选出4个人作为消息汇总人。其余每个人都选择一个汇总人并与之通话;然后4个汇总人再用4通电话互相更新一下消息(用刚才n=4的办法);最后4个汇总人把电话再打回去,实现所有消息全部共享。下面我们证明,2n-4已经是最少的了。证明方法很多,也都很复杂。最常见的证明由Brenda Baker和Robert Shostak在1972年给出。