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 投票算法相关推荐

  1. leetcode 229. Majority Element II(多数投票算法)

    就是简单的应用多数投票算法(Boyer–Moore majority vote algorithm),参见这道题的题解. class Solution { public:vector<int&g ...

  2. matlab 投票法_张量投票算法及其使用并分析.pdf

    张量投票算法及其使用并分析 摘 要 本文主要介绍了一种新的数据分析算法,即张量投票算法.该算法完全利用图像 数据,根据张量分析,矩阵论和几何的知识,对数据点进行编译和几何阐释,再根据心 理学中的Ges ...

  3. Boyer–Moore majority vote algorithm(摩尔投票算法)

    Boyer–Moore majority vote algorithm 摩尔投票算法 Leetcode15: https://leetcode.com/problems/majority-elemen ...

  4. C语言实现boyer moore(博伊尔-摩尔搜索)算法(附完整源码)

    boyer moore博伊尔-摩尔搜索算法 实现以以下相关接口 boyer moore博伊尔-摩尔搜索算法的完整源码(定义,实现,main函数测试) 实现以以下相关接口 int max(int a, ...

  5. java 投票算法_摩尔投票算法 - woshixin的个人空间 - OSCHINA - 中文开源技术交流社区...

    摩尔投票算法(Moore majority vote algorithm) 这个在wiki的介绍在https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_m ...

  6. Boyer-Moore 投票算法小析

    今日get到摩尔投票算法,时间和空间复杂度都得到了最优的结果,觉得非常经典,在此记录,以备今后查阅,同时希望对和我一样的初学者起到抛砖引玉的效果. CiterSeerX上论文链接: https://c ...

  7. 摩尔投票法(Boyer–Moore majority vote algorithm)

    参考资料 论文MJRTY A Fast Majority Vote Algorithm 算法演示网站 维基百科 算法解读 概述 摩尔投票法(Boyer–Moore majority vote algo ...

  8. 数据挖掘十大经典算法 整理

    数据挖掘的主要任务是分类.聚类.关联分析.预测.时序模式和偏差分析. (一)C4.5 算法 C4.5算法是机器学习中的一种分类决策树算法,其核心是ID3 算法,C4.5算法继承了ID3算法的优点,并在 ...

  9. oracle+rac+算法,Oracle RAC中的投票算法

    两个partition都想以为对方出问题,自己需要接管业务,如果没有投票算法就会导致两个partition同时操作数据库(共享存储)的情况 假设,RAC集群中有三台机器,A,B,C A,B,C都会有3 ...

最新文章

  1. mysql隐式转换造成索引失效的事故总结
  2. ABAP常用字符串操作
  3. 天地图 热力图_arcgis js 3.x使用webgl绘制热力图
  4. 牛客网 二叉树的层序遍历
  5. php中goto另一个页面,php中goto操作符的详细介绍
  6. 关于VS.NET RSACryptoServiceProvider的疑惑
  7. 计算机问题求解需要研究的要素,关于计算机音乐制作的空间构成要素的研究
  8. PowerDesigner的基本使用
  9. service mysqld restart 报错 Redirecting to /bin/systemctl restart mysqld.service
  10. 《如何克服社交焦虑》- (美)埃伦·亨德里克森著;冯晓霞译
  11. 从零开始学架构 04-计算高性能FMEA故障模式分析 【笔记】
  12. Regester 正则表达式测试工具
  13. mysql不停库全量备份,mysql全量备份数据
  14. 函数声明应该写在什么位置?main函数里面还是前面?(都可以,只要在调用语句的前面即可)
  15. hexo更换icarus主题和美化
  16. oracle11g ora12170,11g告警日志中大量ORA-12170错误
  17. mysql 关闭防火墙 命令_linux常用命令和关闭防火墙
  18. 层次、网状、关系模型
  19. LTC咨询LTC培训经验分享:华为系智谋帮许浩明老师辅导上市公司欧菲光科技进行基于LTC流程的能力提升
  20. php画拼图滑动验证,滑动拼图验证

热门文章

  1. 微服务访问安全设计方案全探索
  2. 使用wireshark分析tcp/ip报文之报文头
  3. android launchmode singleinstance问题
  4. SNMP、MIB、OID概念的理解
  5. 微信企业号OAuth2.0授权-Java
  6. 2011年1月1日,开篇,起点。
  7. 流氓ONU问题分析和处理
  8. 算法提高课-图论-单源最短路的建图方式-AcWing 1129. 热浪:dijkstra裸题
  9. leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法
  10. linux mysql 5.6.22_linux下MySQL5.6.2安装过程