算法概述
Boyer-Moore 投票算法用于高效寻找数组中出现次数超过半数的元素(多数元素)。其核心思想通过抵消策略将时间复杂度优化至 O(n),空间复杂度为 O(1)。
核心原理
抵消策略 :不同元素相互抵消,最终剩余元素即为候选多数元素。
两阶段流程:
- 候选阶段 :遍历数组,维护候选元素
candidate和计数器count。遇到相同元素时count++,否则count--;当count=0时更新候选元素。 - 验证阶段 :统计候选元素的实际出现次数,确认是否满足
> ⌊n/2⌋。
代码实现
Java 示例
java
public int majorityElement(int[] nums) {
int candidate = 0, count = 0;
for (int num : nums) {
if (count == 0) candidate = num;
count += (num == candidate) ? 1 : -1;
}
return candidate; // 假设多数元素存在
}
正确性证明
- 数学基础 :多数元素出现次数
> n/2,抵消过程中其剩余数量始终占优。 - 示例分析 :数组
[2,2,1,1,1,2,2]的抵消过程:- 初始
candidate=2,count=1 - 遍历至第三个
1时count=0,切换candidate=1 - 最终
candidate=2为正确结果。
- 初始
复杂度与优缺点
- 时间复杂度:O(n),仅需一次或两次遍历。
- 空间复杂度:O(1),仅需常数空间存储变量。
- 优点:高效、简单,适用于数据流场景。
- 缺点:仅适用于严格多数的情况,需验证阶段确保正确性。
应用场景
- 选举系统:快速确定得票过半的候选人。
- 数据分析:识别主要趋势或高频元素。
- 分布式系统:多数共识算法的底层实现。