1,基本思想
Boyer-Moore 投票算法的基本思想是:在每一轮投票过程中,从数组中删除两个不同的元素,直到投票过程无法继续,此时数组为空或者数组中剩下的元素都相等。
如果数组为空,则数组中不存在主要元素;
如果数组中剩下的元素都相等,则数组中剩下的元素可能为主要元素。(可能的原因是,如果是这样的一个数组[1,2,3],那么剩下的元素是3,但是3并不是数量超过一半的元素。)
2,主要步骤
Boyer-Moore 投票算法的步骤如下:
维护一个候选主要元素 candidate 和候选主要元素的出现次数count。
初始时candidate 为任意值,count=0。
遍历数组nums 中的所有元素,遍历到元素 x 时,进行如下操作:
如果count=0,则将 x 的值赋给candidate,否则不更新candidate 的值;
如果 x=candidate,则将 count 加 1,否则将count 减 1。
遍历结束之后,candidate的值可能为主要元素。(可能的原因是,如果是这样的一个数组[1,2,3],那么剩下的元素是3,但是3并不是数量超过一半的元素。)
3,算法分析
时间复杂度 O(n)
空间复杂度 O(1)
4,算法成立原因
在Boyer-Moore 投票算法中,遇到相同的数则将count 加 1,遇到不同的数则将count 减 1。
根据主要元素的定义,主要元素的出现次数大于其他元素的出现次数之和。
因此在遍历过程中,主要元素和其他元素两两抵消,如果存在主要元素的话,最后一定剩下至少一个主要元素。
这个就有点像武林争霸中找势力最大的帮派一样。
假设每次擂台上的两个不同帮派的人一定同归于尽。
那么每次我们随机上两个人,如果是同一帮派,那么现在擂台上该帮派的人数加一。
如果是不同帮派,那么现在在擂台上的帮派的人数减一。
如果擂台上没有人来,那么下一个上擂台的人所在的帮派成为现在在擂台上的帮派。
由于一开始不知道谁是势力最大的帮派,所以各个不同帮派之间两两火并。最后剩下来的一定是势力最大的帮派。
就算所有小帮派知道谁是势力最大的帮派,他们“群起攻之”。每一个小帮派的人都消耗掉势力最大的帮派的一个人。但是由于势力最大的帮派的人数大于一半,所以即使这样,最后剩下来的还是大帮派的人。
5 图解算法