摩尔投票的原理详解

简介: 摩尔投票的原理详解

摩尔投票算法介绍

摩尔投票算法(Boyer-Moore Majority Vote Algorithm)是一种用于查找数组中出现次数超过一半的主要元素的高效算法。它的核心思想是通过消除不同的元素对来找到主要元素,这个算法的时间复杂度为 O(n),其中 n 是数组的长度。下面是该算法的基本原理:

  1. 初始化两个变量 candidatecount,其中 candidate 用于保存候选主要元素,count 用于记录候选主要元素出现的次数。初始时,candidate 可以是任何数组中的元素,而 count 初始化为0。
  2. 遍历数组中的每个元素:
  • 如果 count 等于0,将当前元素设置为候选主要元素 candidate,并将 count 设置为1。
  • 如果count不等于0,检查当前元素是否等于candidate
  • 如果相等,将 count 递增1,表示找到了一个与候选主要元素相同的元素。
  • 如果不相等,将 count 递减1,表示找到了一个与候选主要元素不同的元素。
  1. 在遍历完成后,candidate 变量中存储的元素就是数组中的主要元素。

这个算法的核心思想在于消除不同元素对,最终剩下的元素就是主要元素,因为主要元素的出现次数超过一半。算法的优点是只需要进行一次遍历,具有较低的时间复杂度和空间复杂度。

摩尔投票算法适用于大多数寻找主要元素的问题,例如,查找出现次数超过一半的元素,查找众数等。它是一个高效的算法,通常用于解决此类问题。

案例

假设我们有一个数组 [2, 2, 1, 1, 1, 2, 2],我们要找出其中出现次数超过一半的主要元素。

  1. 初始化 candidate2count1,开始遍历数组。
  2. 继续遍历,遇到相同的元素 2count 增加。
  3. 继续遍历,遇到相同的元素 2count 再次增加
  4. 继续遍历,遇到不同的元素 1count 减少。
  5. 继续遍历,遇到相同的元素 1count 增加。
  6. 继续遍历,遇到相同的元素 1count 再次增加。
  7. 继续遍历,遇到不同的元素 2count 减少。
  8. 继续遍历,遇到相同的元素 2count 增加。
  9. 继续遍历,遇到相同的元素 2count 再次增加
  10. 完成遍历后,candidate 变量中的元素 2 就是数组中的主要元素。

这就是摩尔投票算法的工作原理,通过不断消除不同的元素对,最终找到了主要元素。在这个示例中,主要元素是 2。算法只需要进行一次遍历,具有高效的时间复杂度。

摩尔投票算法,解决的问题是如何在任意多的候选人中,选出票数超过一半的那个人。假设投票是这样的,[A, C, A, A, B],ABC 是指三个候选人。

  1. 第一张票与第二张票进行对坑,如果票不同则互相抵消掉;
  2. 接着第三票与第四票进行对坑,如果票相同,则增加这个候选人的可抵消票数;
  3. 这个候选人拿着可抵消票数与第五张票对坑,如果票不同,则互相抵消掉,即候选人的可抵消票数 -1。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

图解

jyd - 力扣(LeetCode)图片作者

相关文章
|
机器学习/深度学习 自然语言处理 算法
Transformer 模型:入门详解(1)
动动发财的小手,点个赞吧!
14178 1
Transformer 模型:入门详解(1)
|
存储 弹性计算 固态存储
阿里云服务器1TB存储收费标准(数据盘/对象存储OSS/文件存储NAS)
阿里云服务器1TB存储多少钱?系统盘最大可选到500GB,数据盘选到1TB价格为3655元一年。也可以选择对象存储OSS和文件存储NAS
8566 2
阿里云服务器1TB存储收费标准(数据盘/对象存储OSS/文件存储NAS)
|
Linux API C++
PCI-E配置MSI中断流程解析
<div id="article_content" class="article_content" style="margin: 20px 0px 0px; font-size: 14px; line-height: 26px; font-family: Arial;"> <p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0
7676 0
|
虚拟化
vmware虚拟机使用主机代理访问谷歌
vmware虚拟机使用主机代理访问谷歌
1667 4
|
存储 负载均衡 算法
Hash介绍与应用详解
哈希算法在计算机科学中有着广泛而重要的应用,从数据存储、数据完整性校验到密码安全和分布式系统中的负载均衡,哈希函数都发挥着关键作用。通过本文的介绍和示例代码,希望您能更好地理解哈希的基本概念和实际应用,并在您的项目中有效地应用这些知识。
2436 3
2022年最新最详细的IntelliJ idea高效插件的介绍安装,让你的工作效率提升10倍
这篇文章详细介绍了10款IntelliJ IDEA的高效插件,包括Codota代码智能提示、Key Promoter X快捷键提示、CodeGlance代码缩略图、Lombok代码简化、阿里巴巴代码规范检查、SonarLint代码质量检查、Save Actions格式化代码、Translation翻译、Rainbow Brackets彩虹括号和Nyan Progress Bar彩虹进度条插件,旨在帮助提升开发效率和代码质量。
2022年最新最详细的IntelliJ idea高效插件的介绍安装,让你的工作效率提升10倍
|
安全 Java Android开发
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
如何解压OTA升级包、编辑升级包内容(例如移除不需要更新的分区)、重新打包、签名以及验证OTA文件的过程。
1738 2
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
|
资源调度 分布式计算 监控
YARN的基本架构
【6月更文挑战第19天】YARN的基本架构
479 10
Vue3根据搜索框内容跳转至本页面指定位置
Vue3根据搜索框内容跳转至本页面指定位置
798 1
Vue3根据搜索框内容跳转至本页面指定位置
|
机器学习/深度学习 人工智能 PyTorch
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解