设T[0:n-1]是n 个元素的数组。对任一元素x,设S(x)={ i | T[i]=x}。当| S(x) |>n/2 时,称x 为T 的主元素。设计一个算法,确定T[0:n-1]是否有一个主元素。

 
 
算法描述如下:
a1 a2 a3 a4 … aj aj+1 … … an 首先取a1 存入m 中,计数器k 置为1。
然后让m 比较a1,a2…,如果与m 相同,则k 加1,如果不同,k 要减1。
这样执行下去, 可能会在比较完aj 时,k=0,这时从新取aj+1 存入m,k 置为1。
重复上述操作,知道比较完a[1:n]中所有元素。
 
这个过程结束后, k 有两种可能值:①k=0,②k>0。
当k=0 时,a[0:n-1]必无主元素。
当k>0 时,a[0:n-1]可能有主元素,也可能没有主元素。如果 a[0:n-1]有主元素,则m 的值必为主元素。显然再将m 与a[0:n-1]所有元素比较一遍,即可知m 是否为a[0:n-1]的主元素,即a[0:n-1] 是否有主元素。
 
算法如下:
Template<class T>
void MainMember(T a[],int n)
{
  int i,j,k,m;
  m=a[];k=;j=;
  for(i=;i<n;i++)
  {
    if(m==a[i]) k++;
    else k--;
    if(k==)
    {
      i++;
      if(i>n) break;//a[0:n-1]中元素已比较完了,跳出
      m=[i];
      k=;
    }
  }
  if(k==)
    cout<<"数组a 中没有主元素!"<<endl;
  else
  {
    for(i=;i<n;i++)
      if(m==a[i]) j++;
  }
  if(j>n/)
    cout<<"数组a 中存在主元素,主元素为:"<<m<<endl;
  else cout<<"数组a 中没有主元素!"<<endl;
}

线性时间内确定T[0:n]是否有一个主元素的更多相关文章

  1. 二叉树系列 - 二叉搜索树 - 线性时间内把有序链表转化为BST

    引言 本文来自于Google的一道题目: how to merge two binary search tree into balanced binary search tree. how to me ...

  2. Swift3.0语言教程获得一个公共的前缀

    Swift3.0语言教程获得一个公共的前缀 Swift3.0语言教程获得一个公共的前缀,当在一个程序中有多个字符串时,我们需要判断是否有两个字符串有公共的前缀时,是很困难的.在NSString中的co ...

  3. 4、Cocos2dx 3.0三,找一个小游戏开发Hello World 分析

    尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 Hello World 分析 打开新 ...

  4. Thinkphp5.0 在自己定义一个公共方法的控制器并且继承了Controller类的时候报错

    在建立网站的时候,你通常想着把一些共有的方法提取出来,放入一个控制器内,如果你是将业务逻辑写入了构造函数里面,那么就得注意了. 在thinkphp5.0当中,有一个初始化的方法,类似于构造函数,那就是 ...

  5. 用weexplus从0到1写一个app

    说明 基于wexplus开发app是来新公司才接触的,之前只是用过weex体验过写demo,当时就被用vue技术栈来开发app的开发体验惊艳到了,这个开发体验比react native要好很多,对于我 ...

  6. poj 1611 求0号结点所在集合的元素个数

    求0号结点所在集合的元素个数 Sample Input 100 42 1 25 10 13 11 12 142 0 12 99 2200 21 55 1 2 3 4 51 00 0Sample Out ...

  7. +QFTPOPEN: 603,0 怎么把这样一个字符串中的 603 提取出来给一个 uint32_t 的变量那

    +QFTPOPEN: 603,0   怎么把这样一个字符串中的 603 提取出来给一个 uint32_t 的变量那? 注意冒号后面有个空格!!! 答案:要使用 sscanf 标准库函数! char s ...

  8. 用Scratch2.0源码定制一个自己的编辑器

    用Scratch2.0源码定制一个自己的编辑器,换成自己的软件名称和图标,添加中文字体,修复汉化错误等等1.准备:下载Scratch2.0源码.安装开发工具Adobe Flash Builder4.7 ...

  9. 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架

    在过去持续分享的几十期阿里Java面试题中,几乎每次都会问到Dubbo相关问题,比如:“如何从0到1设计一个Dubbo的RPC框架”,这个问题主要考察以下几个方面: 你对RPC框架的底层原理掌握程度. ...

随机推荐

  1. 基于矩阵模式的 Web 软件测试手段(转)

    http://www.ibm.com/developerworks/cn/web/1410_dujing_matrixfortest/ 在 Web 测试中,我们经常针对某个测试点进行多种场景测试,或者 ...

  2. js中substr与substring的用法与区别

    substrsubstr(start,length)表示从start位置开始,截取length长度的字符串. var src="images/pic_1.png";alert(sr ...

  3. DHT11温湿度传感器

    一.硬件介绍 RH是相对湿度,是用零点温度来定义的,一般,RH在45%~65%之间最为合适. 注:NTC为热敏电阻,输出为:单总线数字信号,单线双向串行通讯. 注:上拉电阻情况下,配置为开漏输出,可以 ...

  4. 21.allegro下鼠标形状设置[原创]

    1. -- --- ----- ---

  5. Vector示例一,二

    #include <iostream> int main(void) { double a[] = {1, 2, 3, 4, 5}; std::cout<<mean(a, 5) ...

  6. github概念和实战

    fork: 通过fork操作,你将拥有了别人创建的repo的ownership,但是url却变成了/youraccount/repo,这时你将可以做git push操作 clone: 该命令是直接将r ...

  7. HDU 2830 Matrix Swapping II

    给一个矩阵,依然是求满足条件的最大子矩阵 不过题目中说任意两列可以交换,这是对题目的简化 求出h数组以后直接排序,然后找出(col-j)*h[j]的最大值即可(这里的j是从0开始) 因为排序会影响到h ...

  8. 51nod1204 Parity

    如果sm[j]和sm[i]奇偶性相同,那么(i+1,j)个数为偶数如果奇偶性相同看成是朋友,不同的看成是敌人,那么就跟bzoj1370的做法差不多了. 如果奇偶性相同,就将x和y合并,x+n,y+n合 ...

  9. 51nod1262 扔球

    相关讨论里的答案:(by mint_my ) 1.反弹n次,那起点S,每次反弹点,终点S共连接n+1条边,那么原问题变为从S走n+1条边回到S,为令n=n+12.设步长为a条边,gcd(a,n)==1 ...

  10. BZOJ 1935 园丁的烦恼

    离线,BIT. #include<iostream> #include<cstdio> #include<cstring> #include<algorith ...