投票算法 Boyer-Moore
投票算法 Boyer-Moore
算法描述
Boyer-Moore 投票算法是一种用来在线性时间
内找到数组中出现次数超过一半(即多数元素)的算法。这个算法非常高效,因为它只需要一次遍历数组,并且使用常数级别的额外空间。
算法思路
维护一个候选元素和一个计数器来实现投票算法:
- 初始化一个候选者
candidate
和一个计数器count
- 遍历整个数组:
- 如果
count
为 0,那么将当前元素设为候选者
,并设置该候选者的计数器count
为 1。 - 如果当前正在遍历的元素就是此时的候选者,那么该候选器的计数器
count
+1。 - 如果当前遍历的元素并不是此时的候选者, 那么减少该候选器的计数器值
-1。
- 如果
- 当遍历完成时,候选器
candidate
就是我们要找的多数元素。
算法实现
public int majorityElement(int[] nums) {
int candidate = 0x00; // 候选者
int counter = 0; // 候选者的支持度(计数器)
for (int e: nums) {
if (counter == 0) {
// 如果当前计数器为0,设置当前正在遍历的元素为候选者
candidate = e;
// 设置当前元素的支持度为1
counter = 1;
} else if (e == candidate) {
// 当前元素就是该候选者,计数器+1
counter++;
} else {
// 当前元素不是该候选者,计数器-1
counter-- ;
}
}
return candidate;
}
复杂度分析
时间复杂度
- O(n):Boyer-Moore 投票算法只需要遍历整个数组一次。在最坏的情况下,无论数组长度
n
有多长,都需要检查每个元素一次。因此,时间复杂度是线性的 O(n)。
空间复杂度
- O(1):该算法使用了固定数量的额外空间来存储候选者
candidate
和计数器count
,而这些变量的数量并不随输入数据规模n
的增长而变化。因此,空间复杂度是常数级别的 O(1)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2021-09-25 5-让出CPU执行权的yield方法
2021-09-25 1-1-关系数据库