线性时间内确定T[0:n]是否有一个主元素

设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[0];k=1;j=0;
  for(i=1;i<n;i++)
  {
    if(m==a[i]) k++;
    else k--;
    if(k==0)
    {
      i++;
      if(i>n) break;//a[0:n-1]中元素已比较完了,跳出
      m=[i];       k=1;
    }
  }
  if(k==0)
    cout<<"数组a 中没有主元素!"<<endl;
  else
  {
    for(i=0;i<n;i++)
      if(m==a[i]) j++;
  }
  if(j>n/2)
    cout<<"数组a 中存在主元素,主元素为:"<<m<<endl;
  else cout<<"数组a 中没有主元素!"<<endl;
}
时间: 2024-10-25 19:09:12

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

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

引言 本文来自于Google的一道题目: how to merge two binary search tree into balanced binary search tree. how to merge two binary search tree into balanced binary search tree.. Let there be m elements in first tree and n elements in the other tree. Your merge funct

[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素

题目 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间. 思路一 寻找重复元素,很容易想到建立哈希表来完成,遍历一遍数组就可以将每个元素映射到哈希表中.如果哈希表中已经存在这个元素则说明这就是个重复元素.这种方法可以很方便的在O(n)时间内完成对重复元素的查找.可是题目要求在O(1)的空间.因此采用哈希表这种解法肯定在空间复杂度上是不符合要求的.题目中数组中所以数字都在[0, n-1]区间范围内,因此哈希表的大小为n

线性时间将两个有序链表合成一个有序链表(constant additional space)

description: given two sorted singly list, merge them into one using constant additional space algorithm: we will reference the two linked list as list1 and list2 for convenience, since list1 is sorted,just find the right position for each element in

编程题:将数字0~5放入一个整型数组,并逆序输出数组

#include<stdio.h> void main() { int i,a[5]; for(i=0;i<5;i++)         /*给数组中元素赋值*/ a[i]=i; for(i=4;i>=0;i--)          /*逆序输出数组中元素值*/ printf("%3d",a[i]); printf("\n"); } 编程题:将数字0~5放入一个整型数组,并逆序输出数组,布布扣,bubuko.com

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 Output 411 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # inc

Oracle GoldenGate (ogg) 11.2.1.0.20 是最后一个支持oracle db 10g的 ogg版本

参考原文: Oracle GoldenGate 11.2.1.0.22 Patch Set Availability (Doc ID 1669160.1) 该文章不做翻译,仅仅摘录其中有价值的信息,如下: Alert! OGG 11.2.1.0.22 is -not- available for Oracle Database 10g. Oracle GoldenGate 11.2.1.0.20 is the Terminal Release for support of Oracle Data

Cocos2d-x 3.0 - Eclipse上构建一个Android项目

Cocos2d-x 3.0 - Eclipse上构建一个Android项目 2014年4月30日 4月末 本篇继续介绍Cocos2d-x 3.0的一些基础内容,前面一篇博客介绍了如何在Visual Studio 2012上编译我们的Cocos2d-x项目,也成功把Helloworld运行起来了.跟以往的版本是类似的,只不过创建空项目的时候命令变成了cocos.本篇博客带给大家的是,如何在Eclipse运行起我们的Cocos2d-x项目,如果童鞋们有看我写的Cocos2d-x 2.2.3版本的交叉

JavaFX 2.0+ -- Menu显示超过一个屏幕滚动条Bug

背景 在JavaFX中,当MenuBar的Menu或者其Sub-Menu包含的MenuItem合计超过一个屏幕所能显示的高度时,菜单能够滚动显示.此时有一个Bug,滚动的位置会被记录,同一个层级的所有ContextMenu都会使用同一个滚动位置,也就是说当在一个ContextMenu中向下滚动超过一些距离后,另一个ContextMenu可能就完全无法看到ContextMenu. 分析 这个Bug根本的原因就是不同的ContextMenu共用了同一个滚动位置,按理来说,不同的ContextMenu

产生一个列表,其中有40个元素,每个元素是0到100的一个随机整数

方法1:   1!/usr/bin/env python                                                               2 # coding=utf-8                                                                      3   4 #产生一个列表,其中有40个元素,每个元素是0到100的一个随机整数                       5 #如果这个列表中