摩尔投票的原理详解

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

摩尔投票算法介绍

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


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


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


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


案例

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


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


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

 

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


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


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

图解

 


jyd - 力扣(LeetCode)图片作者

相关文章
|
7月前
|
存储 算法
摩尔投票的原理详解
摩尔投票的原理详解
88 0
|
7月前
DAY-3 | 摩尔投票法:巧求众数问题
LeetCode 链接:[Majority Element](https://leetcode.cn/problems/majority-element/)。这道题要求找到数组中出现次数超过数组长度一半的元素,也称为众数。文章介绍了使用摩尔投票法来解决此类问题,这种方法通过相互抵消的方式高效地找到多数元素。首先假设第一个元素是众数,然后遍历数组,遇到相同元素计数加一,不同元素计数减一,计数为零时更换假设的众数。最后计数不为零的元素即为众数。此外,还讨论了摩尔投票法的拓展应用和暴力统计的解法。
114 5
|
存储 缓存 算法
数据结构与算法第十六讲:分布式算法之一致性Hash算法
数据结构与算法第十六讲:分布式算法之一致性Hash算法
139 0
|
算法 JavaScript Android开发
LeetCode 周赛上分之旅 #33 摩尔投票派上用场
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
81 0
|
人工智能 算法 Java
摩尔投票法
摩尔投票法
187 0
|
程序员
L1-045 宇宙无敌大招呼 (5 分)
L1-045 宇宙无敌大招呼 (5 分)
145 0
|
算法 安全 区块链
白话讲解,拜占庭将军问题
作为服务端开发的同学,你可能听说过Paxos、Raft这类分布式一致性算法,也在工作中使用过ZooKeeper、etcd等工具来解决一致性问题。但你可能不知道,这些算法和工具解决的并不是一致性中最难的问题,要讨论这个最难的问题,这就要追溯到 Leslie Lamport 1982 年发表的著名论文 《拜占庭将军问题》(The Byzantine Generals Problem )上了。
白话讲解,拜占庭将军问题

热门文章

最新文章