摩尔投票算法

278 阅读2分钟

摩尔投票算法(Moore's Voting Algorithm)是一种在数组或序列中查找出现次数超过一半的主要元素的算法,其中主要元素指的是在数组中出现次数超过数组长度一半的元素。这个算法的关键思想是通过不同元素之间的抵消来找到可能的主要元素候选者,并在最后验证候选者是否真正满足要求

通俗一点的解释就是可以把它想象成人群中的投票过程,就像选举一样。有一个人群里面有很多人,每个人手里都拿着一个标牌,上面写着一个数字。这些数字中,有一个数字出现的次数比其他数字都多。我们的目标是找到这个出现次数最多的数字。

摩尔投票算法的思想是,让每对不同的数字互相“抵消”,就像投票一样。具体做法是,让两个不同的数字相互“消掉”,直到没有可以抵消的数字为止。最后剩下的数字就很有可能是出现次数最多的数字。

摩尔投票算法的基本原理

关于摩尔投票算法的基本原理可以大致归纳为以下几步
(为了方便理解,使用较为通俗语言进行描述):

  1. 假设第一个数字是候选数字,计数为 1 。
  2. 遍历后面的数字,如果遇到相同的数字,计数加 1 ;如果遇到不同的数字,计数减 1 。
  3. 当计数减到0时,将当前数字设为新的候选数字,计数重新设为 1 。
  4. 最后剩下的候选数字很有可能是出现次数最多的数字。

通过这种在人群中的“投票”过程,我们最终能找出出现次数最多的数字,就像选出了获胜者一样。这就是摩尔投票算法的基本原理

摩尔投票算法的优缺点

优点:

● 时间复杂度低:算法只需要遍历数组两次,时间复杂度为O(n) ,其中n是数组长度。
● 空间复杂度低:算法只需要常数级的额外空间,因此空间复杂度为O(1)
高效:适用于大规模数据,能够在较短时间内找到主要元素。

缺点:

● 不适用于所有情况:算法要求主要元素的出现次数超过一半,因此对于没有主要元素的情况不适用
需要额外验证:算法找到候选主要元素后,还需要额外的遍历来验证其是否真的满足条件。

代码示例

/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
   let candidate=null
   let count =0
  for(let ele of nums){
      if(count===0){
          candidate=ele
      }
      if(ele!==candidate){
          count--
      }else{
          count++
      } 
  }
   
return candidate
};