问题:在一个规模为N的数组array[N]中,所谓主元素就是出现次数大于N/2的元素,例如
3.3.4.2.4.4.2.4.4 有一个主元素为4。
给出一个算法,如果过半元素存在,就找出来,否则给出报告,要求给出O(N)的算法。
常规想法
(1) 穷举:找出元素中每一个数在数据中的数量。时间复杂度O(N^2)
(2) 排序:先对数组快排,然后重头开始遍历一遍计算每个数的数量。时间复杂度O(N*logN+N)
经典算法
裁剪数组算法,
时间复杂度为O(2N
)
思想: 如果一个数组array[N],其中有两个元素e1和e2。
(1) e1不等于e2
假如e1是数组array[N]的主元素,e2不是。那么e1在array[N]中的数量en>N/2。此时去掉array[N]中的e1和e2两个元素(e1!=e2)。那么新数组array[N-2]中e1的数量为en-1,并且en-1>N/2-1=(N-2)/2。即e1还是新数组array[N-2]的主元素。
假如e1和e2都不是数组array[N]的主元素,那么去掉e1、e2以后。那么新数组的大小将变成N-2。此时很有可能出现一个新数组的主元素X,此主元素X的数量正好等于X=(N-2)/2+1。但是该主元素就不是原数组的主元素了,因为X=
(N-2)/2+1=N/2。那么这样的主元素X我们叫做伪主元素。因此需要通过和裁剪掉元素比较,来确定是否是真正的主元素。
(2) e1等于e2
这种情况下不能进行裁剪。只能继续找不同的两个数裁减掉
#include<stdio.h>
#include<malloc.h>
// 算法源代码,裁剪当前数组中相邻的不同元素
void main(){
int pArr[6]={4,4,4,4,6,6};
int arrLength=6; //数组长度
int element=pArr[0];
int value=1; //记录剪裁过程中遇到相同元素的个数
int delNum=0; //记录裁剪数组的元素个数
int *dArr=(int *)malloc(arrLength*sizeof(int)); //记录被剪裁的数组元素
int dTop=0; //当前剪裁数组的索引位置
for(int i=1;i<arrLength;i++){
if(value==0){
element=pArr[i];
}
if(pArr[i]==element) //如果当前数组相邻的元素相等
value++;
else if(value>0){//如果当前数组相邻的元素不等,则需要裁剪得到新的数组
dArr[dTop++]=element;
dArr[dTop++]=pArr[i];
delNum+=2;
value--;
}
}
//如果裁剪之后出现了主元素,那么这个主元素有可能是个伪主元素
if(value>(arrLength-delNum)/2){
//与裁剪掉的数组元素一一比较
for(int j=0;j<delNum;j++)
if(element==dArr[j]) value++;
//确定真正的主元素
if(value>arrLength/2)
printf("主元素为:%d\n",element);
}
分享到:
相关推荐
"4-14_lv一维数组中所有元素之和"是一个关于如何在LV中计算一维数组所有元素和的小程序。下面将详细解释这个主题。 一、一维数组的概念 一维数组可以看作是一条线性序列,其中每个元素都有一个唯一的索引。在LV中,...
若有一个自然数序列,长度为n,若其中某一个自然数出现的次数超过...现在给你一个自然数序列,长度不定,要求设计一个尽可能高效的算法找出这个序列是否存在这样的一个主数。 若存在,输出这个主数,若不存在,输出-1.
1. 创建数组:首先,你需要创建一个数组来存储你的数据。在LabVIEW的函数选板中,找到“数组”类别,然后选择适当的数组构造函数,如一维数组或二维数组。 2. 编程逻辑:使用LabVIEW的控制结构(如循环)来遍历数组...
在“找两个数组的不同值”这个问题中,我们通常会创建两个数组,然后遍历它们,找出只存在于一个数组而不在另一个数组中的元素。以下是一个基本的步骤概述: 1. **声明和初始化数组**:首先,你需要声明两个相同...
核心逻辑可以封装在一个递归方法中,每次递归选择一个数组中的元素,然后对剩余的数组继续进行相同的操作。以下是基本的步骤: 1. **初始化**:定义一个空的结果列表,用于存储所有组合。 2. **递归函数**:设计一...
请设计一个线性时间算法,判断input中的数据是否存在主元素。在实验报告中对算法时间复杂度作出分析。 输入:文件的第1行为数组S中元素个数n;接下来的n 行中,每行有一个自然数。程序运行结束时,将计算结果输出到...
请设计一个线性时间算法,判断input中的数据是否存在主元素。在实验报告中对算法时间复杂度作出分析。 输入:文件的第1行为数组S中元素个数n;接下来的n 行中,每行有一个自然数。程序运行结束时,将计算结果输出到...
在上面的程序中,我们定义了一个递归函数 `recursiveSearch`,用于搜索数组中的元素。该函数接收四个参数:数组 `arr`、左边界 `l`、右边界 `r` 和需要搜索的元素 `x`。函数的思想是,如果需要查找的元素与左边界最...
1、将一个数组中的元素倒排过来,不能新开一个数组的临时存储空 间,只能在原数组上改。 2、写一个类用来模拟栈这种数据结构,要求底层 使用数组存储数据, 并给出相应的进栈和出栈的方法。MyStack int arr[]; int ...
在计算机科学和数据分析领域,"主元素"(Majority Element)是一个重要的概念,尤其是在数据处理和算法设计中。主元素是指在给定的一组数字中出现次数超过数组长度一半的元素。如果存在这样的元素,那么它就是数组的...
C语言程序设计-有一个一维数组score,内放10个学生的成绩,用一个函数来求平均成绩;
主元素问题解法2.rar 主元素问题解法2.rar 主元素问题解法2.rar 主元素问题解法2.rar 主元素问题解法2.rar 主元素问题解法2.rar 主元素问题解法2.rar 主元素问题解法2.rar 主元素问题解法2.rar 主元素问题解法2.rar ...
java代码-使用java计算NxN整型数组中主对角线和副对角线上数字之和的源代码 ——学习参考资料:仅用于个人学习使用!
通过分治算法来求解一个数组中的最大值和最小值,不仅可以有效地降低问题的复杂度,还能充分利用计算机的处理能力。此外,这种方法还具有很好的可扩展性和并行处理潜力,非常适合于处理大规模数据集。
在本主题“随计法求主元素”中,我们探讨的是一种利用蒙特卡罗算法寻找数组主元素的方法。蒙特卡罗算法是一种基于随机抽样或统计试验的计算方法,它以概率论为基础,通过随机数生成来解决问题,通常用于复杂度较高的...
C语言程序设计-编写程序,产生16个随机数到4行4列的数组中,求其主对角线元素之和(提示:产生随机值要用到教材P274“其他实用函数”里的:rand函数,要求包含头文件“stdlib.h”)函数补充说明: ⑴rand( )%a+b:...
首先,我们需要一个包含多个元素的数组,例如`$source`: ```php $source = array('pll', '我', '爱', '你', '嘿'); ``` 为了确保数组初始有序,可以使用`sort()`函数对其进行排序。虽然全排列过程中顺序不重要,但...
初始化数组通常指的是为数组中的每个元素赋予一个特定的值。计算对角线元素之和则涉及到对数组的遍历,主对角线的遍历规则是行号等于列号,而副对角线的遍历规则是行号与列号之和等于数组的行数减一。通过两重循环...
声明测试类TestStudent完成对多态性的测试:(1)在主方法中声明Student类的数组(含五个元素)。...(3)将方法testScore()发送给数组的每一个元素,输出结果,并分析具体执行的是哪一个类中的方法