想象一下,你是一位议员,此时投票大厅内正在激烈的讨论谁可以当上选下一届众议院主席,在采取投票制的情况下,仍有一些狂热的议员大打出手,因为他们之间都互相不服,此刻你想到一个主意,既然是投票那就是少数服从多数,为了避免某些小团体的恶意投票,可以采取投票可以互相抵消的办法,到最后谁的票数最多,那么他就可以当选。
起初的票数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)。
上面就是摩尔投票法的大致操作,它的使用层面并不是很广,大多数情况下只适用于寻找出现超过一半以上的那个数。
下面是该算法的代码实现: