
摩尔投票算法
文章摘要
LCY AI Pro
本文讲解了摩尔投票算法的核心思想,说明了如何在线性扫描中选出多数元素候选人并在必要时二次验证。
摩尔投票算法
摩尔投票算法(Boyer-Moore Majority Vote Algorithm)是一种由 Robert S. Boyer 和 J. Strother Moore 于 1981 年提出的用于在 时间复杂度和 空间复杂度下,寻找数组中出现次数超过一半(大于 )的多数元素的有效算法。
算法执行步骤
算法主要分为两个阶段:
阶段1:寻找候选人(Candidate)
我们维护两个变量:candidate(当前候选人)和 count(计数器,初始为 0)。
- 遍历数组中的每一个元素
x:- 如果
count == 0:说明之前的“战斗”已经平息,此时将x设为新的candidate,并将count设为 1。 - 如果
count != 0:- 如果
xcandidate:说明遇到了盟友,count加 1。 - 如果
xcandidate:说明遇到了敌人,两人同归于尽,count减 1。
- 如果
- 如果
阶段2:验证候选人(可选)
第一阶段结束后,candidate 仅仅是可能的多数元素。
- 如果题目保证数组中一定存在多数元素,则直接返回
candidate。 - 如果题目不确定是否存在多数元素,则需要再次遍历数组,统计
candidate出现的实际次数。如果次数大于 ,则它才是真正的多数元素。
算法特点分析
- 时间复杂度:。只需要遍历一次数组(如果需要验证则为两次)。
- 空间复杂度:。只需要两个变量来存储候选人和计数,与输入规模无关。
- 局限性:只能寻找出现次数 超过一半 的元素。如果目标元素只出现了恰好一半或更少,该算法无法保证结果的正确性。
代码实现示例
1 | def majorityElement(nums): |
1 |
|
注: C++ 代码省略了
main()函数,仅给出摩尔投票算法的实现方式。
总结
摩尔投票算法通过 “抵消” 非多数元素的方式,巧妙地利用了多数元素在数量上的绝对优势。它不需要像哈希表那样消耗额外空间,也不需要像排序那样耗费更多时间,是处理“众数问题”的有效解法之一。
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自2507 LearningHub
评论 ()

