算法整理:Boyer-Moore 投票算法

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 图解算法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值