Boyer-Moore 投票算法

Boyer-Moore 投票算法

该算法的原始研究发表在 https://www.cs.utexas.edu/~moore/best-ideas/mjrty/

该方法基本上非常简单,它依赖于这样一个事实,即如果一个元素出现超过 1/2 次,那么它在体积方面的贡献最大。

所以我们取一个元素,如果下一个元素与取的元素相同,我们将增加一个计数器,否则我们将减少计数器。如果我们按照这个逻辑,我们将在最后得到对数组体积贡献最大的元素。

注意:我们对找到重复出现多少次的频率不感兴趣,我们只需要找到在数组体积中贡献最高的元素。

让我们通过示例来了解这种方法

我们有元素,

[1 1 1 3 3 2 2 3 3 3 2 3 3]

现在,我们将候选元素作为第一个元素,并用计数 1 表示它。

现在,我们增加指针,因为下一个元素与候选元素相同,我们将增加计数。

现在,如您所见,下一个元素不是 1,因此我们减少计数并移动指针,直到计数器不为 0

因此,经过 3 次迭代后,我们的计数变为 0。现在,当计数变为 0 时,这就是我们需要更改候选元素的标志。因此,我们将候选元素从 1 更改为 2。然后重新开始计数

现在,再次因为我们得到的元素与候选元素不同,我们将减少计数并在计数变为 0 时重新实例化

现在,在几次迭代后重复相同的过程,我们得到 2。所以我们再次将计数从 2 减少到 1,但此后我们又得到 3,所以再次从 1 变为 2,最后以 3 结束。

现在,我们丢弃无用的计数,候选元素是数组中出现次数超过 1/2 的元素。

这个逻辑的整个代码如下:

 类解决方案(对象):  
 def 多数元素(自我,数字):  
 """  
 :type nums: 列表[int]  
 :rtype: 整数  
 """  
 候选人 = 数字 [0]  
 计数 = 1  
  
 对于范围内的 i (1, len(nums)):  
 如果 nums[i] == 候选人:  
 计数 += 1  
 elif 计数 == 0:  
 候选人 = nums[i]  
 别的:  
 计数 -= 1  
  
 返回(候选人)

感谢您阅读我的文章!!!接近我 https://linktr.ee/prituldave

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/25820/58401023

posted @   哈哈哈来了啊啊啊  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示