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 版权协议,转载请附上原文出处链接和本声明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通