问题:

有整型数组a[1…n],如果整数x在数组a中出现的次数多于半数,则x称为多数元素。

初级方法:

  1. 计算每一个元素出现的次数,算法复杂度O(NlogN)
  2. 可以寻找中间值元素,因为多数元素在序列中必为中间值元素,时间复杂度是O(n)

分析此问题:
容易证明引理:在原序列中去除两个不同的元素后,那么在原序列中的多数元素在新序列中还是多数元素。

因此在以上引理的支持下,规模为n的问题就规约为求解规模为n-2的问题,于是我们可以得到一个时间复杂度也是O(n)、但是隐藏常数会比寻找中间值的方法要小的算法。

算法基本思路:

(1)在寻找多数元素的过程中,将计数器初始化为1,遇到相同元素则计数器加1,遇到不同元素则计数器减1,一直到计数器等于0或遍历完整个序列。由此可见,计数器的值表示当前元素抵消掉不同元素后的出现次数;

(2)当计数器在遍历完整个序列前就已经是0,则忽略掉已经遍历过的元素(可以看作两两抵消不影响序列中的多数元素),跳到下一个元素然后计数器重新置1,重复上述步骤,一直到遍历完整个序列;

(3)当遍历完整个序列后,算法会返回一个值,此时我们还需要检测一次这个值是否真的是多数元素,即遍历统计一次。这一步不可或缺。因为上述两个步骤到了遍历完序列后必将返回一个值,无论序列有无多数元素。此值存在两种情况,第一,它真的是多数元素;第二,它只是序列后面的某个元素刚好抵消完序列。所以我们必须检测一次。

算法的实现

寻找候选者算法:

int Candidate(int* A, int m , int n)
{//寻找A[m...n]中多数元素候选者c=A[m];count=1;for(j=m+1;count>0&&j<n;j++)  {if(A[j]==c)count++;else count--;}if(j==n)return c;elsereturn canditate(j); //对A[j...n]寻找多数元素候选者。
}

寻找数组多数元素的算法

bool Majority(int* A, int n, int* major) {c = conditate(A, 0, n-1);for (i=0; i<n; ++i)if (A[j] == c)count++;if ( count > n/2 ){*major = c;// major即为所求return 1;}else return  0; //返回0表示不存在多数元素
}    

寻找多数元素(主元素)相关推荐

  1. 数据结构实验 寻找数组主元素(2013考研题)

    题目 [问题描述] 已知一个整数序列A长度为N其中若存在a且a的个数大于N/2则称为A的主元素 例如0 5 5 3 5 7 5 5 则为主元素 5 又如0 5 5 3 5 1 5 7则中没有主元素. ...

  2. 算法-寻找第k小元素(C)

    序言 刚开始我认为,寻找第k小的元素:简单呀,先对所有元素排序,之后再找不就完事啦,这时时间复杂度在O(nlgn).那有没有更好的排序的方法了呢?答案:当然是有的. 算法基本思路: (1) 当规模小于 ...

  3. 高斯列选主元素消元法

    代码实现 // // main.cpp // 列选主元素消元法 // // Created by 刘国栋 on 2018/10/16. // Copyright © 2018年 LGD. All ri ...

  4. 主元素问题 Majority Element

    2018-09-23 13:25:40 主元素问题是一个非常经典的问题,一般来说,主元素问题指的是数组中元素个数大于一半的数字,显然这个问题可以通过遍历计数解决,时间复杂度为O(n),空间复杂度为O( ...

  5. Majority Element:主元素

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  6. 高斯主元素消去法c语言,列主元Gauss消去法(C++实现)

    列主元Gauss消去法(C++) 目的:编写解n阶线性方程组AX=b的列主元三角分解法的通用程序: 原理:列主元素消去法是为控制舍入误差而提出来的一种算法,列主元素消去法计算基本上能控制舍入误差的影响 ...

  7. 主元素、主元素II、主元素III

    写在前面 这类题目之前还真没接触过,没什么好的思路.不过看要求又是一道考虑时间复杂度的问题,需要掂量(考虑)一下自己的算法有没有达到要求.根据自己目前的能力写出来的算法还真没做到O(n)的时间复杂度, ...

  8. 解决寻找第K小元素问题——三种不同的算法实现

    个人原创,禁止转载--Zetrue_Li 问题描述:在一个序列里找出第K小元素 以下程序基于函数 int select_kth_smallest(list q, int k) 实现 :返回向量q中第k ...

  9. 寻找第K大元素的八大算法、源码及拓展

    寻找第K大元素的八大算法.源码及拓展 http://www.cnblogs.com/bethunebtj/p/4861378.html 一.问题描述 所谓"第(前)k大数问题"指的 ...

  10. Hoare选择算法 寻找第k小元素C实现 算法的“AWK脚手架和grap运行过程分析”

    现实生活中常有找"最大"."最小"及"中位数"等需求,解决这样的问题不用将整个序列排序.寻找"最大"."最小& ...

最新文章

  1. android在控制台签名apk
  2. 每日简单小妙招:使用python自动登录CSDN等各大网站
  3. 前端预览word文件_[装机必备] QuickLook —— 敲击空格即可快速预览文件
  4. 微信开发者工具 wxmi修改模版颜色_十款高效好用的在线网页工具,提升你的办公效率...
  5. linux裁剪内核和移植,嵌入式Linux内核裁剪及移植的研究与实现
  6. linux巡检脚本生成word,Linux 编写安全巡检脚本
  7. 2021-2025年中国超声波管道监测系统行业市场供需与战略研究报告
  8. Ubuntu中zabbix4.2配置shell脚本邮件报警
  9. linux7配置永久路由,CentOS7添加永久路由
  10. Exadata V2 Battery Replacement
  11. Python 中的浮点数
  12. android布局参照示例_约束布局Android示例–第2部分
  13. Python 爬虫的集中简单方式
  14. java, android的aes等加密库
  15. Django 千锋培训的学习笔记
  16. F1C100S自制开发板调试过程
  17. Linux字符终端用鼠标移动一个红色矩形
  18. GB28181的NAT穿透
  19. Qt windows端的蓝牙串口服务
  20. java--顺序、选择、循环结构

热门文章

  1. C语言char *转数组,C语言char*字符串数组和unsigned char[]数组的相互转换
  2. 【LC简单】1294. 不同国家的天气类型
  3. 被动环绕解码混音方法
  4. 慕课JAVA重温---类、对象、封装、继承、多态
  5. 基于多尺度卷积神经网络的滚动轴承故障诊断
  6. 自动驾驶汽车建立在更好的传感器技术之上
  7. 我的世界60秒换位置服务器,怎么给我的世界服务器换周目
  8. cocos2d 丢失MSVCR110.dll
  9. CameraLink 高清医学影像分析模块
  10. 知乎在港上市背后:阿里、京东亏损惨重,创新工场、今日资本大幅减持