`
hao3100590
  • 浏览: 131827 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

主元素算法

阅读更多

1.算法描述(算法分析2.26)

大小为N的数组A,其主元素是一个出现超过N/2次的元素(从而这样的元素最多只有一个)。例如,数组

3,3,4,2,4,4,2,4,4只有一个主元素4; 3,3,4,2,4,4,2,4没有主元素

求出主元素,没有请指出

 

2.书中列出了一种算法,暂且叫递归法,这可以自己看书,其复杂度也只有O(n)

 

下面介绍两种其他的方法。

在网上还有其他一些方法:http://wintys.blog.51cto.com/425414/100688/

 

3.方法一

 

思想就是利用主元素的个数是>N/2的这一性质,复杂度O(n)

*首先,随机选取一个作为主元素

*其次,依次遍历数组,遍历中遇到相同的count++,否则count--

*如果<=0时在换主元素

*最后,剩下的就做为主元素的人选

*当然选出来的不一定就是主元素,还要检测,如果检测成功,那必定就是主元素,否则就没有

 

 

int getMain(int* a, int length){
	int count =0;
	int seed = a[0];
	for(int i=0; i<length; i++){
		if(a[i]==seed) count++;
		else if(count>0) count--;
		else seed = a[i];
	}
	return seed;
}

 这个方法很简单,简洁明了

 

4.方法二

 

方法二:利用快速排序,最后选取N/2处的元素作为主元素,复杂度为快速排序的复杂度

*当然选出来的不一定就是主元素,还要检测,如果检测成功,那必定就是主元素,否则就没有

 

int getMain1(int* a, int length){
	quickSort(a, 0, length-1);
	return a[length/2];
}

 就是利用了快速排序

 

5.全部代码

 

/**
	*2.26找超过n/2次出现的主元素
	**/
#include <iostream>
using namespace std;


//检查是否是主元素
bool check(int* a, int length, int n){
	int count = 0;
	for(int i=0; i<length; i++){
		if(a[i]==n) count++;
	}
	if(count>length/2) return true;
	return false;
}

void swap(int &a, int &b){
	int temp = a;
	a = b;
	b = temp;
}

//一次划分 
int partition(int *a, int first, int end){
	int i=first;                        //初始化
	int j=end;
	while(i < j){
		while(i<j && a[i] <= a[j]) j--;
		if(i<j){
			swap(a[i], a[j]);
			i++;
		}
		while(i<j && a[i] <= a[j]) i++;
		if(i<j){
			swap(a[i], a[j]);
			j--;
		}
	}
	return i;
}

//快速排序
void quickSort(int* a, int first, int end){
	if(first < end){
		int pivot=partition(a, first, end);  //一次划分
    quickSort(a, first, pivot-1);//递归地对左侧子序列进行快速排序
    quickSort(a, pivot+1, end);  //递归地对右侧子序列进行快速排序
	}
}


/**
	*方法一:思想就是利用主元素的个数是>N/2的这一性质,复杂度O(n)
	*首先,随机选取一个作为主元素
	*其次,依次遍历数组,遍历中遇到相同的count++,否则count--
	*如果<=0时在换主元素
	*最后,剩下的就做为主元素的人选
	*当然选出来的不一定就是主元素,还要检测,如果检测成功,那必定就是主元素,否则就没有
	**/
int getMain(int* a, int length){
	int count =0;
	int seed = a[0];
	for(int i=0; i<length; i++){
		if(a[i]==seed) count++;
		else if(count>0) count--;
		else seed = a[i];
	}
	return seed;
}


/**
	*方法二:利用快速排序,最后选取N/2处的元素作为主元素,复杂度为快速排序的复杂度
	*当然选出来的不一定就是主元素,还要检测,如果检测成功,那必定就是主元素,否则就没有
	**/
int getMain1(int* a, int length){
	quickSort(a, 0, length-1);
	return a[length/2];
}

int main(){
	int a[] = {6,1,6,3,6,6,4,2,6};
	//动态获取数组的长度
	int length = sizeof(a)/sizeof(int);
//	int v = getMain(a, length);
	int v = getMain1(a, length);
	cout<<"length:"<<length<<",seed:"<<v<<endl;
	if(check(a, length, v)){
		cout<<"主元素是:"<<v<<endl;
	}else{
		cout<<"没找到主元素!"<<endl;
	}
	return 0;
}
分享到:
评论

相关推荐

    随计法求主元素.zip

    在计算机科学领域,主元素(Pivot Element)通常是指在一个数组或数据集合中具有特殊性质的元素,例如在排序算法中作为划分基准的元素。在本主题“随计法求主元素”中,我们探讨的是一种利用蒙特卡罗算法寻找数组主...

    线性选择找出主元素 主元素问题

    请设计一个线性时间算法,判断input中的数据是否存在主元素。在实验报告中对算法时间复杂度作出分析。 输入:文件的第1行为数组S中元素个数n;接下来的n 行中,每行有一个自然数。程序运行结束时,将计算结果输出到...

    北航 数值分析 列主元素高斯算法

    在列主元素高斯算法中,我们首先选择每列中绝对值最大的元素作为主元素,然后通过行交换确保主元素在其所在行和列的上三角位置。这样做的目的是减少计算过程中可能出现的舍入误差,提高算法的稳定性。 具体步骤如下...

    列主元素消去法求LU分解

    列主元素消去法是实现LU分解的一种策略,它在每一步选择列中的最大元素(主元素)进行行交换和标量乘法,以确保下三角矩阵的非零元素都在对角线上。 列主元素消去法的具体步骤如下: 1. **选择主元素**:对于矩阵A...

    寻找一堆数字中的主元素

    在计算机科学和数据分析领域,"主元素"(Majority Element)是一个重要的概念,尤其是在数据处理和算法设计中。主元素是指在给定的一组数字中出现次数超过数组长度一半的元素。如果存在这样的元素,那么它就是数组的...

    3_2.rar_4 3 2 1_主元素_主元素的判定_分治 主元素

    主元素 线性选择算法主元素的判定(分治策略) 设T[0:n-1]是n个元素的数组,如果其中某个元素x在整个数组中的出现次数超过n/2,则称x为数组T的主元素。 请设计一个分治算法,判断数组T={1,2,2,2,3,4,3,2,2,4,2,2,6,7...

    高斯列主元素消去法C++算法及示例

    经典的高斯列主元素消去法C++算法及示例 纯C++代码,速度和精度都非常高! 示例中包含了算法的全部源代码以及详细的使用示例! // 高斯消元法 // 输入: // int NA 矩阵阶数 // double A[] 系数矩阵,将二维用一维...

    Gauss主元素消去法

    Gauss主元素消去法的算法理论主要包括以下步骤: 1. **消元过程**:首先,从系数矩阵中选择第一行最大绝对值的元素,通过行交换使其成为首行的主元素。接着,通过行倍加操作消除下一行的对应元素,形成阶梯形矩阵。...

    主元素问题代码

    算法分析课程作业,C语言编写,可能需要用input.txt输入,主元素问题代码

    主元素C程序,分析时间复杂度,包括线性情况

    在计算机科学中,主元素(Pivot Element)通常是指在排序或查找算法中起到关键作用的一个元素。在本文中,我们将深入探讨一个用C语言编写的主元素相关程序,特别是它如何进行时间复杂度分析,并关注线性情况。C语言...

    matlab求主元素问题

    请设计一个线性时间算法,判断input中的数据是否存在主元素。在实验报告中对算法时间复杂度作出分析。 输入:文件的第1行为数组S中元素个数n;接下来的n 行中,每行有一个自然数。程序运行结束时,将计算结果输出到...

    高斯主元素消去法求解线性代数方程(C程序)

    总结起来,使用C语言和高斯主元素消去法解决线性方程组,需要理解算法原理,熟悉文件读写操作,以及掌握C语言的数组操作和函数设计。通过这个过程,不仅可以学习到数值计算的方法,还能提升编程技巧。

    高斯列主元素消去法.rar_matlab列主高斯_列主元素法_高斯列主元消去法_高斯消去法

    在MATLAB中,可以编写函数来实现这个算法,或者利用已内置的`lu`函数,它可以同时完成行变换和列主元素的选择,得到LU分解,再通过回带求解得到线性方程组的解。 总结起来,高斯列主元素消去法是一种针对数值稳定性...

    列主元素Gauss消去法解线性方程组

    - **列主元素选择**:在每一步迭代中,选择当前列中绝对值最大的元素作为主元,这有助于减少舍入误差,并提高算法的稳定性。 2. **C语言实现** - 在C语言中,可以使用二维数组表示矩阵,通过指针操作实现行变换。...

    算法设计与分析

    主元素问题: 设T[0..n-1]是n个元素的数组。对任一元素x,设S(x)={i|T[i]=x}。当|S(x)|&gt;n/2时,称x为T的主元素。如果T中元素存在序关系,按分治策略设计并实现一个线性时间算法,确定T[0..n-1]是否有一个主元素。

    免疫算法与遗传算法比较1

    - **交叉与变异操作**:遗传算法中交叉操作为主,变异操作为辅,以实现平稳的全局收敛;免疫算法中变异操作更为重要,以维持多样性,辅助交叉操作。 - **记忆库**:免疫算法引入了记忆库的概念,存储问题的解决方案...

    考研数据结构算法代码总结.pdf

    主元素查找算法是针对数组中的一个整数序列,如果序列中有一个元素出现次数超过一半,称这样的元素为主元素。为了找到主元素,可以采用分治策略,对数组进行划分,递归找出左半部分和右半部分的主元素,然后根据两边...

    DA_DA算法_蜻蜓算法_蜻蜓算法matlab

    - **主循环**:调用以上函数,执行算法的迭代过程。 蜻蜓算法的优点包括全局搜索能力、简单易实现、鲁棒性强等,但也有如收敛速度较慢、容易陷入局部最优等不足。通过调整参数和引入新的改进策略,如混沌、遗传、...

    随机算法编程举例。案例丰富

    2. **找主元素的随机算法**: 主元素是指矩阵中最大或最小的元素。传统的线性搜索算法在大型矩阵中效率低下。随机化算法,如快速选择算法,可以通过随机抽取元素作为基准,然后将矩阵划分为小于、等于和大于基准的...

    高斯列主元素消去法(C++).rar_site:www.pudn.com_高斯消去法c++

    - `hw_1.cpp`:这是实际的C++源代码文件,其中实现了高斯列主元素消去法的算法。 在`hw_1.cpp`文件中,开发者可能定义了一个或多个函数来执行高斯消去过程。通常,算法会包括以下几个步骤: 1. **初始化**:创建一...

Global site tag (gtag.js) - Google Analytics