摩尔投票法和大多数

保姆级教程:用Ventoy给Win2025 Server LTSC优化版制作万能启动盘(附驱动问题解决方案) 本文提供了一份详细的Ventoy启动盘制作教程,帮助用户轻松管理多系统安装镜像,并重点解决Win2025 Server LTSC优化版在非服务器硬件上的驱动兼容性问题。通过版本转换、强制安装驱动等多种方案,确保系统稳定运行,适合开发机和家庭媒体中心等场景。 阅读详情

我的原文:http://www.hijerry.cn/p/45987.html

摩尔投票算法

假设有这样一个场景:票选村长,每人可投一票,我们将候选村长从1开始编号,村民们在票上写上候选村长的编号即可完成投票。那么最后统计的票可形成一个整型数组。那么谁是村长呢?票数过半的那个人。

摩尔投票算法可以快速的计算出一个数组中出现次数过半的数即大多数(majority),算法核心思想是同加,异减。我们举个例子。

假设数组是:[1,2,1,1,2,1]。算法步骤如下:

  • 1。当前大多数是1,得分置1
  • 2。与当前大多数不同,得分 - 1,得分为0,当前大多数 = 1
  • 1。与当前大多数不同,得分为0,所以设置当前大多数 1 -> 1,得分置1
  • 1。与当前大多数相同,得分 + 1,得分为2,当前大多数 = 1
  • 2。与当前大多数不同,得分 - 1 ,得分为1,当前大多数 = 1
  • 1。与当前大多数相同,得分 + 1,得分为2,当前大多数 = 1

这意味着1是这个数组中出现次数过半的数。

可以感受得到,算法会保存一个当前大多数,和得分,当遇到一个数不是当前大多数时,得分会减一,当减到0时,大多数会发生改变,并且重置得分为1。

这里需要区分的是,摩尔算法不能用来得到众数(mode),例如数组:[1,1,1,2,2,3,3,4,4],摩尔算法得出最后的结果应该是4,但4并不是众数,可是显然4也不是大多数,那是因为,大多数是指出现次数过半的数,而这个数组中没有这样的数,所以摩尔算法是是失效的,对于这种情况采取需要重新投票。

出现次数超过一半的数

LeetCode原题:169. Majority Element

这里要求出现次数大于一半,所以直接套用摩尔投票算法即可得到答案。

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        a, ca = None, 0
        for n in nums:
            if   a == n : ca += 1
            elif ca == 0: a, ca = n, 1
            else        : ca -= 1
        
        return a

出现次数超过数组1/3长

LeetCode原题:229. Majority Element II

还能用摩尔投票法吗?答案当然是要,但是需要变通一下。

需要注意的是出现次数超过1/3数组长的数,也许会有多个,例子如下:

  • [1,1,1,2,2,2,3,3],数组1/3长=2(向下取整),所以1和2都是符合条件的。

但最多只能是2个,证明如下:

证明

假设数组有且只有3个数a,b,c,它出现的次数分别为ca, cb ,cc ,不妨假设 c a = c b = ⌊ n 3 ⌋ + 1 ca = cb= ⌊\frac n 3⌋ + 1 ca=cb=⌊3n​⌋+1,数组长度为 n n n

设 n = 3 a + b n = 3a + b n=3a+b,其中 a 、 b a、b a、b均为非负整数,其实这就是余数公式,其中 b b b 是余数, a = ⌊ n 3 ⌋ a = ⌊\frac n 3⌋ a=⌊3n​⌋,那么 n 3 = a + b 3 \frac n 3 = a + \frac b 3 3n​=a+3b​,即 n 3 − b 3 = ⌊ n 3 ⌋ \frac n 3 - \frac b 3 = ⌊\frac n 3⌋ 3n​−3b​=⌊3n​⌋

所以:

① c a + c b + c c = n ca + cb + cc = n ca+cb+cc=n

② c a + c b = 2 ∗ ( n 3 − b 3 ) + 2 = 2 n 3 − 2 b 3 + 2 ca + cb = 2 * (\frac n 3 - \frac b 3) + 2 = \frac {2n} 3 - \frac {2b} 3 + 2 ca+cb=2∗(3n​−3b​)+2=32n​−32b​+2

由①、②整理得 c c = n + 2 b − 6 3 cc = \frac {n + 2b - 6} 3 cc=3n+2b−6​ ,做差:

③ c c − ⌊ n 3 ⌋ = n + 2 b − 6 3 − n 3 + b 3 = b − 2 cc - ⌊\frac n 3⌋ = \frac {n + 2b - 6} 3 - \frac n 3 + \frac b 3 = b - 2 cc−⌊3n​⌋=3n+2b−6​−3n​+3b​=b−2

因为 b = n % 3 b = n \% 3 b=n%3,所以 b − 2 ≤ 0 b - 2 \le 0 b−2≤0 恒成立,所以 c c ≤ ⌊ n 3 ⌋ cc \le ⌊\frac n 3⌋ cc≤⌊3n​⌋

可以知道,如果连 c a = c b = ⌊ n 3 ⌋ + 1 ca = cb= ⌊\frac n 3⌋ + 1 ca=cb=⌊3n​⌋+1 时都找不到一个 c c cc cc 使得它大于 ⌊ n 3 ⌋ ⌊\frac n 3⌋ ⌊3n​⌋,那么取ca、cb为其他比 ⌊ n 3 ⌋ ⌊\frac n 3⌋ ⌊3n​⌋ 大的数,更加不可能找到符合条件的 c c cc cc 。

综上,一个数组中不可能存在2个以上的数它们出现的次数大于 ⌊ n 3 ⌋ ⌊\frac n 3⌋ ⌊3n​⌋。

回到题目

如果我们在使用摩尔算法时,同时记录两个大多数,会怎么样呢?直觉告诉我,这会得到一个大多数,和一个出现次数仅次于大多数的数,但是这两个数不一定会比数组长的1/3大

所以我们得到它们后,还需要检查它们出现的次数是否符合条件。

AC代码:

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        a, b, ca, cb, ans = None, None, 0, 0, []
        for n in nums:
            if   n  == a: ca += 1
            elif n  == b: cb += 1
            elif ca == 0: a, ca = n, 1
            elif cb == 0: b, cb = n, 1
            else:         ca, cb = ca - 1, cb - 1
        ca, cb = 0, 0
        for n in nums:
            if   n == a: ca += 1
            elif n == b: cb += 1
        
        if ca > len(nums)/3:
            ans.append(a)
        if cb > len(nums)/3:
            ans.append(b)
        return ans
保姆级教程:用DH参数法自己动手推导六轴机械臂运动学方程 本文详细介绍了使用DH参数法推导六轴机械臂运动学方程的完整过程,包括连杆坐标系建立、变换矩阵推导及MATLAB实现。通过保姆级教程,帮助读者掌握从理论到实践的机械臂建模技巧,特别针对初学者常见错误提供解决方案,适合机器人工程学生和DIY爱好者学习。 阅读详情

相关推荐

ubuntu安装英伟达显卡驱动后wifi消失解决方法

ubuntu安装英伟达显卡驱动后(比如4090和3090等),会把wifi和蓝牙驱动去除,导致wifi无法连接。需要重新下载驱动安装。

人工智能(AI)技术,大模型技术,深度学习,机器学习,计算机视觉,AI工具实践应用等分享 3904

使用集成学习多数投票分类器对鸢尾花进行分类

使用集成学习多数投票分类器对鸢尾花进行分类

KylinSchmidt的博客 1558

python 抖音采集_python爬取抖音视频的实例详解

import requestsimport jsonimport reimport osfrom pprint import pprint as ppimport queueclass DouYin:header = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*...

weixin_35795675的博客 1864

周志华《Machine Learning》学习笔记(10)--集成学习

上篇主要介绍了鼎鼎大名的EM算法,从算法思想到数学公式推导(边际似然引入隐变量,Jensen不等式简化求导),EM算法实际上可以理解为一种坐标下降法,首先固定一个变量,接着求另外变量的最优解,通过其优美的“两步走”策略能较好地估计隐变量的值。本篇将继续讨论下一类经典算法–集成学习。

VAY-长跑 8818

【SLG游戏服务器开发手册】(ROK Like)沙盘地图篇一,菱形瓦片与笛卡尔坐标系的转换(附调试工具)

轴向坐标:以菱形网格对角方向为基准轴,记作(q, r)菱形瓦片宽度 w=2a,高度 h=a(宽高比2:1)

代码时光 981

深入解析Matlab phantom函数:从基础模体到自定义头部仿真

本文深入解析了Matlab中的phantom函数,它是医学图像处理算法测试的核心工具。文章详细介绍了如何使用内置的Shepp-Logan及其改良版头部仿真模体,并重点讲解了通过自定义参数矩阵来构建专属模体的方法。通过从生成模体到模拟投影(正弦图)再到图像重建的完整实战流程,展示了phantom函数在CT等算法开发与验证中的关键作用。

m3n5b7v8c9x的博客 951

6-2、选择器

选择器

鸵鸟 1114

Qwen2.5-VL模型微调实战:从零到部署的完整流程(附避坑指南)

本文详细介绍了Qwen2.5-VL视觉语言模型从零开始的完整微调与部署流程。内容涵盖使用LLaMA-Factory进行LoRA微调的关键参数配置与避坑指南,以及如何将训练好的模型权重合并,并最终利用vLLM高性能推理引擎进行部署,为开发者提供了一套可落地的实战方案。

oo7890的博客 593

摩尔投票法的理解

摩尔投票法基于这样一个事实,当一个数的重复次数超过数组长度的一半,每次将两个不相同的数删除,最终剩下的就是要找的数。 算法步骤: 1.count = 0;num = nums[0]; 表示从此时开始计算投票。 2.遍历数组,如果接下来出现的数字与num相同,count加1。如果不同,count减1。 3.如果count == 0,表示之前出现的所有数字中num都是可以凑成不同的数对...

shxifs的博客 7727

YOLOv8的二次创新 | 结合iRMB与EMA打造全新的iEMA机制,提升动态检测性能【附保姆级代码】

YOLOv8继承了YOLO系列的轻量化和高效检测特性,同时通过改进的架构设计使得其在实时场景下具有更高的检测精度。然而,随着检测需求的增加,尤其是在动态目标检测和长时间序列检测中,YOLOv8的鲁棒性依然可以提升。通过iEMA机制的引入,我们将在这些方面进行进一步优化。iRMB模块是我们对传统Residual Block的进一步改进。通过多层特征提取,iRMB能够捕捉更多层次的特征信息,并通过引入轻量化的残差结构,提升计算效率。

一键难忘的博客 3086

小白也能懂!一步步教你用FPGA加速YOLO目标检测(入门篇)

安装到 PYNQ 开发板中。该库为 PYNQ 平台提供了对量化神经网络(如 YOLO)的硬件加速支持。确保你的电脑已连接到外网,如 WiFi 或热点(手机热点理论上也可用,未实测)。当你看到安装成功的提示后,打开 Jupyter Notebook,你会发现在。趁这个机会,泡了杯茶,刷了会儿手机,顺便感慨了一下开源社区的强大……页面中多出了一些新的项目文件夹 —— 这就是我们刚才安装的。参数,浅拷贝只克隆最近一次提交,减少数据量,避免超时问题。初始化,打开该文件,即可运行我们的Tiny YOLO。

FJN110的博客 1598

什么是摩尔投票法?

目录一、摩尔投票法?概述步骤二、实战题目解题 一、摩尔投票法? 概述 摩尔投票法又称多数投票法,主要用于解决一个数组中的众数的问题。 步骤 对抗阶段:分属两个候选人的票数两两对抗抵消 计数极端:计算对抗结果中最后留下的候选人票数是否有效 二、实战 LeetCode主要元素 题目 数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。 解题 public int majorityElement(int[] nums) { int major=num

weixin_43589025的博客 1525

SOEM主站开发篇(1):移植SOEM主站到Linux开发板

详细介绍了SOEM主站源码移植到Linux开发板上的步骤,同时演示了如何使用Linux开发板获取EtherCAT从站的PDO映射信息。

kevin1499的博客 2398

摩尔投票法

摩尔投票法可以用来寻找数组中的多数元素。 经典的摩尔投票法用来寻找数组中出现次数超过一半的元素。如leetcode 169: 1.169. 多数元素 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例1: 输入: [3,2,3] 输出: 3 示例2: 输入: [2,2,1,1,1,2,2] 输出: 2 一个数组中出现次数大于n/2的元素最多只有1个。考虑这样一...

HackingGate的博客 1656

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

摩尔投票法寻找众数

题目要求:输入一个整数数组,找出其中所有出现超过 n/2或者n/3 次的元素并返回。(众数未必存在) 摩尔投票法 摩尔投票法的基本思想是,在每一轮投票过程中,从数组中找出一对不同的元素,将其从数组中删除。这样不断的删除直到无法再进行投票,如果数组为空,则没有任何元素出现的次数超过该数组长度的一半。如果只存在一种元素,那么这个元素则可能为目标元素。 寻找数组中出现个数超过n/2的众数 首先来考虑最简...

George_RED的博客 1472

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

摩尔投票法——Java

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 假设数组是非空的,并且给定的数组总是存在多数元素。 //摩尔投票法 //找出一组数字序列中出现次数大于总数1/2的数字(并且假设这个数字一定存在)->显然这个数字只可能有一个。 //每次从序列里选择两个不同的数字删除掉(“抵消”掉) //最后剩下一个数字或几个相同的数字,就是出现次数大...

qq_38208506的博客 829

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

摩尔投票法的应用

关于摩尔投票法: 候选人(cand_num)初始化为nums[0],票数count初始化为1。 当遇到与cand_num相同的数,则票数count = count + 1,否则票数count = count - 1。 当票数count为0时,更换候选人,并将票数count重置为1。 遍历完数组后,cand_num即为最终答案。 为何这行得通呢? 投票法是遇到相同的则票数 + 1,遇到不同的...

clonechen 699

LeetCode题集 —— 多数元素——拓展摩尔投票法

题目一:多数元素 思路一:暴力求解 思路二:中位数 思路三:摩尔投票法 题目二:主要元素 题目三:多数元素 【2】

LYJbao的博客 2040

【Leetcode】摩尔投票法

问题描述: 摩尔投票法: 票数和: 由于众数出现的次数超过数组长度的一半;若记 众数 的票数为 +1+1 ,非众数 的票数为 -1−1 ,则一定有所有数字的 票数和 > 0>0 。 票数正负抵消: 设数组 nums 中的众数为 xx ,数组长度为 nn 。若 nums 的前 aa 个数字的 票数和 = 0=0 ,则 数组后 (n-a)(n−a) 个数字的 票数和一定仍 >0>0 (即后 (n-a)(n−a) 个数字的 众数仍为 xx )。 算法原理: 算法流程: 复杂度分析:

qqqking的博客 598
上一篇: Centos7修改docker的Data Space Total大小
下一篇: NLTK常用操作和语料库
爆浆大鸡排
博客等级 码龄11年 65粉丝 66原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值