Boyer-Moore 投票算法

算法概述

Boyer-Moore 投票算法用于高效寻找数组中出现次数超过半数的元素(多数元素)。其核心思想通过抵消策略将时间复杂度优化至 O(n),空间复杂度为 O(1)。

核心原理

抵消策略 :不同元素相互抵消,最终剩余元素即为候选多数元素。
两阶段流程

  1. 候选阶段 :遍历数组,维护候选元素 candidate 和计数器 count。遇到相同元素时 count++,否则 count--;当 count=0 时更新候选元素。
  2. 验证阶段 :统计候选元素的实际出现次数,确认是否满足 > ⌊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=2count=1
    • 遍历至第三个 1count=0,切换 candidate=1
    • 最终 candidate=2 为正确结果。

复杂度与优缺点

  • 时间复杂度:O(n),仅需一次或两次遍历。
  • 空间复杂度:O(1),仅需常数空间存储变量。
  • 优点:高效、简单,适用于数据流场景。
  • 缺点:仅适用于严格多数的情况,需验证阶段确保正确性。

应用场景

  • 选举系统:快速确定得票过半的候选人。
  • 数据分析:识别主要趋势或高频元素。
  • 分布式系统:多数共识算法的底层实现。
相关推荐
大明者省16 分钟前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
hsjiasb19 分钟前
FreeRTOS学习(二十六)——动态内存管理heap_1到heap_5
stm32·单片机·学习·学习笔记·freertos
崇子嵘24 分钟前
基于zynqMP15eg的linux驱动学习
学习
嘻哈∠※1 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7982 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2582 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
知识分享小能手2 小时前
线性代数学习教程,从入门到精通,向量组的线性相关性 — 完整知识点梳理(7)
学习·线性代数·机器学习
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
Shell运维手记3 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI3 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法