用“打架”来理解摩尔投票法,生动形象一看就懂
1.问题提出
摩尔投票法,最简单形象的理解,就是一群人去抢座位。
在某个战乱年代,有m个来自不同阵营的人,要去争抢n个王座,大家都想抢,怎么办呢,那肯定是谁的人多,谁就可以坐上王座呗。比如只有1个王座的话,那人数必须要大于总人数一半(1 / 2)的阵营才可以坐,否则其他阵营的人联合起来就可以把你搞死;有2个王座的话,那人数必须要大于总人数的 (1/3)的两个阵营可以坐,有n个王座,那阵营人数必须大于m * (1 / n)。
那么这个问题抽象化就是:如何从一个长度为m的数组中,找到出现次数大于(1 / n) * m次的数?
2.一个王座(n = 2)
A A B C B A A
假设现在有如上7个人来自A B C三个阵营,要抢一个王座,那么按照顺序:
-
首先是A,一来发现王座是空的,那他就坐上去,此时王座属于A阵营
-
下一个又是A,发现自家已经占了王座了,针不戳,于是王座的A阵营人员+1
-
然后是B,发现座位上有人了,那不行,得打一架