摩尔投票的原理详解

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

摩尔投票算法介绍

摩尔投票算法(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)
动动发财的小手,点个赞吧!
14050 1
Transformer 模型:入门详解(1)
|
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
7613 0
|
9月前
鸿蒙开发:单一手势实现多次点击事件
TapGesture点击手势,在实际的开发中,更多的是运用于双击或者需要多次点击的场景,如果仅仅是单次点击,建议大家直接使用onClick即可。
185 1
鸿蒙开发:单一手势实现多次点击事件
|
虚拟化
vmware虚拟机使用主机代理访问谷歌
vmware虚拟机使用主机代理访问谷歌
1469 4
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文件的过程。
1537 2
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
|
JavaScript 前端开发 Java
Github 上 8 个很棒的 Vue 项目
Github 上 8 个很棒的 Vue 项目
708 0
|
资源调度 分布式计算 监控
YARN的基本架构
【6月更文挑战第19天】YARN的基本架构
429 10
对List进行排序,值为null的排到最后
对List进行排序,值为null的排到最后
Vue3根据搜索框内容跳转至本页面指定位置
Vue3根据搜索框内容跳转至本页面指定位置
761 1
Vue3根据搜索框内容跳转至本页面指定位置

热门文章

最新文章