摩尔投票法

    想象一下,你是一位议员,此时投票大厅内正在激烈的讨论谁可以当上选下一届众议院主席,在采取投票制的情况下,仍有一些狂热的议员大打出手,因为他们之间都互相不服,此刻你想到一个主意,既然是投票那就是少数服从多数,为了避免某些小团体的恶意投票,可以采取投票可以互相抵消的办法,到最后谁的票数最多,那么他就可以当选。

  起初的票数vote为零,当A的候选人得到一票时vote为1,当下一个的票得人是B时,那么他们之间得选票互相抵消,再一轮如果A或者B他们之间谁得了一票那就加一,按照此规则一直进行下去,直到所有选民投完票,最后还有票数的议员就当选了。

  再回到抽象出的模型上,这里“候选人”可以是单个字符,当然也可以整形数组或者字符串,可以定义一个计数器vote来记录各个元素之间的得票数,红色代表A的得票,黄色代表B的得票,绿色代表C的的票,按照规则当A第一个被投票时,vote+1,此时A(1),(括号内为得票数),遍历的下一个元素是B,B的得票为1抵消掉A的一票此时A与B的得票数都为0,A(0),B (0),继续遍历,下一个遇到的元素是C此时C的得票数为1,前面由于A与B的得票相互抵消,他们的得票数均为0,所以C不需要抵消票数,那么A的得票数为1,A (1),下一个得票人为C那么他们之间的票数又相互抵消掉了……继续执行下去最后只剩下A还有一票A(1)。

  上面就是摩尔投票法的大致操作,它的使用层面并不是很广,大多数情况下只适用于寻找出现超过一半以上的那个数。

下面是该算法的代码实现:

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值