首页 > 编程语言 >Boyer-Moore投票算法

Boyer-Moore投票算法

时间:2022-11-03 10:56:15浏览次数:66  
标签:count candiate Moore 元素 算法 数组 众数 Boyer

算法简介

在一个数组中,存在一个众数,众数的数量要大于数组大小的一半。设计时间复杂度为 O(n),空间复杂度为 O(n) 的算法: 在数组中找出该众数。

该算法维护了两个变量:候选人 candiate 和投票数目 count。其基本算法步骤如下:

  1. 初始化 candiate 为任意值,count 的值为0;
  2. 遍历数组,如果 count 为 0,那么将当前元素的值赋给 candiate
  3. 如果当前元素的值与 candiate 的值相同,则 count 加1;
  4. 如果当前元素的值与 candiate 的值不同,则 count 减1;
  5. 重复步骤 2-4,最终 candiate 即为目标众数;

简单来说,该算法的过程如下:

例如,现在要竞选总统,只有某人的票数超过总票数的一半时,这个人才会当选总统。目前的投票结果如下:

在前 4 票中,Mike 占了 2 票,Tina 和 John 分别占 1 票,没有人的票数大于 2 票,那么他们之间就会相互抵消:

在第 5 票和第 8 票中,同样的,Mike 占 2 票,John 和 Henry 分别占 1 票,没有人的票数大于 2 票,那么他们之间会相互抵消:

在最后剩下的 2 票中,只有 Mike,因此 Mike 最终竞选成功,当选总统:

正确性证明

假设当前数组大小为 \(n\),众数的数目为 \(m\),且一定存在 \(2m>n\)。

此时,如果抵消一对数组元素,且这两个元素中至少有一个数不是众数,那么会存在如下两种情况:

情况1:这两个元素都不是众数

该情况下存在 \(2m>n-2\),该式子依然成立。

情况2:这两个元素有一个是众数

该情况下存在 \(2(m-1)>n-1\),该式子依然成立。

算法实现

class Solution {
public:
	int majorityElement(vector<int>& nums) {
		int candidate = -1, int count = 0;
		for (int num : nums) {
			if (num == candidate)
				++count;
			else if (--count < 0) {
				candidate = num;
				count = 1;
			}
		}
		return candidate;
	}
};

题目来源:Leetcode - 169.多数元素

标签:count,candiate,Moore,元素,算法,数组,众数,Boyer
From: https://www.cnblogs.com/tuilk/p/16853697.html

相关文章

  • raft算法(分布式一致性算法)
    一、概要Raft算法属于Multi-Paxos算法,它是在Multi-Paxos思想的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理解和算法实......
  • 算法题--从尾到头打印链表
    5要求时间限制:1秒空间限制:32768K题目描述输入一个链表,从尾到头打印链表每个节点的值解题思路链表必须要从头开始访问,如果需要将打印顺序颠倒,可以利用栈的特性。有时......
  • 代码随想录算法训练营第八天|344、反转字符串|541、反转字符串Ⅱ|剑指Offer 05、替换
    344、反转字符串·两两交换给字符串翻个面doge题目链接:https://leetcode.cn/problems/reverse-string/submissions/思路:首尾交换代码实现:     时间复杂度O(n......
  • 实验二:逻辑回归算法实验
    实验二:逻辑回归算法实验   【实验目的】理解逻辑回归算法原理,掌握逻辑回归算法框架;理解逻辑回归的sigmoid函数;理解逻辑回归的损失函数;针对特定应用场景及数据,能......
  • 儒略日算法
    儒略日C/C++//儒略日C++14autotoJulianDay(intyear,intmonth,intday)->int{constintadj=(14-month)/12;constinty=year+4800-adj......
  • 算法题--替换空格
    4要求时间限制:1秒空间限制:32768K题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为WeAreHappy.则经过替换之后的字符串为We%20Are%20Happy.......
  • 算法题--替换空格
    4要求时间限制:1秒空间限制:32768K题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为WeAreHappy.则经过替换之后的字符串为We%20Are%20Happy......
  • 机器学习EM算法
    目录​​1初识EM算法​​​​2EM算法介绍​​​​2.1极大似然估计​​​​2.1.1问题描述​​​​2.1.2用数学知识解决现实问题​​​​2.1.3最大似然函数估计值的求解......
  • 决策树算法题目
    1、豌豆种子    2、感冒诊断   ......
  • 【算法与数据结构2】数据结构基础----数组、列表
    一、物理结构数组  数组是存储相同数据类型的元素的一种有序数据结构,通过下标进行存储。查找的时间复杂度为O(1),而删除和添加的时间复杂度为O(n)。其代码实现如下:pu......