关于一种投票阵营信息调查问题的研究

考虑如下问题:

假设有一场投票,但是我们不知道投票者谁和谁是一个阵营的,为了防止绑票行为的出现,我们必须要事先知道参与投票的人有没有超过半数的是属于同一阵营的。为此,我们雇佣了私家侦探,私家侦探每次可以调查任意两个人的关系,并且告诉你他们是不是属于同一阵营的。但是调查的费用很贵,所以请你设计一个算法,使得用最少的调查次数确定这次投票中有没有一个团体人数是超过总人数一半的。(假设每个人不能同时属于多个阵营)


那么我们应该以怎么样的策略去组织调查呢?先用最简单的策略,从第一个人开始,调查他和后面的人的关系,然后完全确定第一个人所属的阵营,如果这个阵营的人数超过总人数的一半,则返回true;否则,我们就把属于这个阵营的人全部排除,然后在剩下的人中重复以上的过程。直到最后所有人都被排除,返回false. 很明显,这个策略的代价是O(n^2)的,非常的昂贵。为什么这个策略这么贵?从信息学上来说,一份价钱一份货,你付出了昂贵的代价,所以你获得了比想知道的信息还要多的额外信息——你知道了每个人所属的阵营,以及所有的阵营构成!然而,我们不需要知道这么多,我们关心的只是有没有某个阵营的人数过半,仅此而已。


接下来,我们来看看以上的那个暴力算法有没有什么地方可以被优化的,所谓优化就是省略获取不必要信息的过程。比如说,如果我们已经调查过的人的总数已经超过半数了,但是还是没有发现大阵营的出现,那么剩下的人我们就不必调查了,因为他们即使完全属于一个阵营,人数也不可能超过一半。但是这个优化并没起到多大作用,我们会发现,最后的花费依然是O(n^2)。


有没有什么办法给以不用获得完全的信息,就把数量大小确定呢?注意,我们是判断有没有一个人数超过半数的阵营存在,而并不是去求这个阵营究竟有多少人——或许我们可以把人数信息省略掉,仅仅保留集合之间的偏序关系?!对于这题来说,如何确定存在一个最大阵营Q,它比别的阵营都大?


为了简化,假设我们有两个集合Q, P(|Q|-|P|=2k, 假设总数是偶数). 然后对Q,P中的元素随机配对。如果两个配对元素分别属于Q,P, 那么当把这两个元素去除后,Q依然是最大的集合(|Q|-|P|=2k);当去除所有这样的元素对以后,剩下的配对只可能是在Q,P内部的,而且由于Q的元素数量大于P,所以Q中的配对数也是大于P的 (|Q|/2-|P|/2=k)。这样,即使Q, P中再各自消去一半的元素,Q依然是最大的集合。这种不断配对,不断消去的过程,一定会持续到最后只有一个集合,这个集合中只有一个元素!如果这样的集合存在,那么它一定就是由Q变化来的,否则,如果所有集合都消失了,只能说最后一定存在两个大小都是1的集合,然后他们抵消了,这也同时说明一开始最大的集合就不存在。


更具体的说,假设某个最大集合Q(|Q|>|!Q|)存在,那么对于某个配对p来说,如果p中的元素是来自不同集合的,那么即使这两个元素都被消除了,Q依然是最大的。如果是来自相同集合的,那么!Q中的那些配对的总和也不可能超过Q中的配对总和。所以这个消除过程最后的结果就是:


如果一开始大集合Q存在,则结果一定是最后这个集合会被保留下来,返回true;

但是如果一开始大集合不存在,则以上分析就会被推翻,结果是不定的,可以返回true,也可以返回false.


所以true是不能被相信的,对于返回的true,必须要再拿这个元素和所有元素比较一遍,以确定最后的大小确实是大于半数的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值