算法整理:Boyer-Moore 投票算法
1,基本思想
Boyer-Moore 投票算法的基本思想是:在每一轮投票过程中,从数组中删除两个不同的元素,直到投票过程无法继续,此时数组为空或者数组中剩下的元素都相等。
如果数组为空,则数组中不存在主要元素;
如果数组中剩下的元素都相等,则数组中剩下的元素可能为主要元素。(可能的原因是,如果是这样的一个数组[1,2,3],那么剩下的元素是3,但是3并不是数量超过一半的元素。)
2,主要步骤
Boyer-Moore 投票算法的步骤如下:
维护一个候选主要元素 candidate 和候选主要元素的出现次数count。
初始时candidate 为任意值,count=0。
遍历数组nums 中的所有元素,遍历到元素 x 时,进行如下操作:
如果count=0,则将 x 的值赋给candidate,否则不更新candidate 的值;
如果 x=candidate,则将 count 加 1,否则将count 减 1。
遍历结束之后,candidate的值可能为主要元素。(可能的原因是,如果是这样的一个数组[1,2,3],那么剩下的元素是3,但是3并不是数量超过一半的元素。)
3,算法分析
时间复杂度 O(n)
空间复杂度 O(1)
4,算法成立原因
在Boyer-Moore 投票算法中,遇到相同的数则将count 加 1,遇到不同的数则将count 减 1。
根据主要元素的定义,主要元素的出现次数大于其他元素的出现次数之和。
因此在遍历过程中,主要元素和其他元素两两抵消,如果存在主要元素的话,最后一定剩下至少一个主要元素。
这个就有点像武林争霸中找势力最大的帮派一样。
假设每次擂台上的两个不同帮派的人一定同归于尽。
那么每次我们随机上两个人,如果是同一帮派,那么现在擂台上该帮派的人数加一。
如果是不同帮派,那么现在在擂台上的帮派的人数减一。
如果擂台上没有人来,那么下一个上擂台的人所在的帮派成为现在在擂台上的帮派。
由于一开始不知道谁是势力最大的帮派,所以各个不同帮派之间两两火并。最后剩下来的一定是势力最大的帮派。
就算所有小帮派知道谁是势力最大的帮派,他们“群起攻之”。每一个小帮派的人都消耗掉势力最大的帮派的一个人。但是由于势力最大的帮派的人数大于一半,所以即使这样,最后剩下来的还是大帮派的人。
5 图解算法
算法整理:Boyer-Moore 投票算法相关推荐
- leetcode 229. Majority Element II(多数投票算法)
就是简单的应用多数投票算法(Boyer–Moore majority vote algorithm),参见这道题的题解. class Solution { public:vector<int&g ...
- matlab 投票法_张量投票算法及其使用并分析.pdf
张量投票算法及其使用并分析 摘 要 本文主要介绍了一种新的数据分析算法,即张量投票算法.该算法完全利用图像 数据,根据张量分析,矩阵论和几何的知识,对数据点进行编译和几何阐释,再根据心 理学中的Ges ...
- Boyer–Moore majority vote algorithm(摩尔投票算法)
Boyer–Moore majority vote algorithm 摩尔投票算法 Leetcode15: https://leetcode.com/problems/majority-elemen ...
- C语言实现boyer moore(博伊尔-摩尔搜索)算法(附完整源码)
boyer moore博伊尔-摩尔搜索算法 实现以以下相关接口 boyer moore博伊尔-摩尔搜索算法的完整源码(定义,实现,main函数测试) 实现以以下相关接口 int max(int a, ...
- java 投票算法_摩尔投票算法 - woshixin的个人空间 - OSCHINA - 中文开源技术交流社区...
摩尔投票算法(Moore majority vote algorithm) 这个在wiki的介绍在https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_m ...
- Boyer-Moore 投票算法小析
今日get到摩尔投票算法,时间和空间复杂度都得到了最优的结果,觉得非常经典,在此记录,以备今后查阅,同时希望对和我一样的初学者起到抛砖引玉的效果. CiterSeerX上论文链接: https://c ...
- 摩尔投票法(Boyer–Moore majority vote algorithm)
参考资料 论文MJRTY A Fast Majority Vote Algorithm 算法演示网站 维基百科 算法解读 概述 摩尔投票法(Boyer–Moore majority vote algo ...
- 数据挖掘十大经典算法 整理
数据挖掘的主要任务是分类.聚类.关联分析.预测.时序模式和偏差分析. (一)C4.5 算法 C4.5算法是机器学习中的一种分类决策树算法,其核心是ID3 算法,C4.5算法继承了ID3算法的优点,并在 ...
- oracle+rac+算法,Oracle RAC中的投票算法
两个partition都想以为对方出问题,自己需要接管业务,如果没有投票算法就会导致两个partition同时操作数据库(共享存储)的情况 假设,RAC集群中有三台机器,A,B,C A,B,C都会有3 ...
最新文章
- mysql隐式转换造成索引失效的事故总结
- ABAP常用字符串操作
- 天地图 热力图_arcgis js 3.x使用webgl绘制热力图
- 牛客网 二叉树的层序遍历
- php中goto另一个页面,php中goto操作符的详细介绍
- 关于VS.NET RSACryptoServiceProvider的疑惑
- 计算机问题求解需要研究的要素,关于计算机音乐制作的空间构成要素的研究
- PowerDesigner的基本使用
- service mysqld restart 报错 Redirecting to /bin/systemctl restart mysqld.service
- 《如何克服社交焦虑》- (美)埃伦·亨德里克森著;冯晓霞译
- 从零开始学架构 04-计算高性能FMEA故障模式分析 【笔记】
- Regester 正则表达式测试工具
- mysql不停库全量备份,mysql全量备份数据
- 函数声明应该写在什么位置?main函数里面还是前面?(都可以,只要在调用语句的前面即可)
- hexo更换icarus主题和美化
- oracle11g ora12170,11g告警日志中大量ORA-12170错误
- mysql 关闭防火墙 命令_linux常用命令和关闭防火墙
- 层次、网状、关系模型
- LTC咨询LTC培训经验分享:华为系智谋帮许浩明老师辅导上市公司欧菲光科技进行基于LTC流程的能力提升
- php画拼图滑动验证,滑动拼图验证
热门文章
- 微服务访问安全设计方案全探索
- 使用wireshark分析tcp/ip报文之报文头
- android launchmode singleinstance问题
- SNMP、MIB、OID概念的理解
- 微信企业号OAuth2.0授权-Java
- 2011年1月1日,开篇,起点。
- 流氓ONU问题分析和处理
- 算法提高课-图论-单源最短路的建图方式-AcWing 1129. 热浪:dijkstra裸题
- leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法
- linux mysql 5.6.22_linux下MySQL5.6.2安装过程