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;
}
分享到:
相关推荐
在计算机科学领域,主元素(Pivot Element)通常是指在一个数组或数据集合中具有特殊性质的元素,例如在排序算法中作为划分基准的元素。在本主题“随计法求主元素”中,我们探讨的是一种利用蒙特卡罗算法寻找数组主...
请设计一个线性时间算法,判断input中的数据是否存在主元素。在实验报告中对算法时间复杂度作出分析。 输入:文件的第1行为数组S中元素个数n;接下来的n 行中,每行有一个自然数。程序运行结束时,将计算结果输出到...
在列主元素高斯算法中,我们首先选择每列中绝对值最大的元素作为主元素,然后通过行交换确保主元素在其所在行和列的上三角位置。这样做的目的是减少计算过程中可能出现的舍入误差,提高算法的稳定性。 具体步骤如下...
列主元素消去法是实现LU分解的一种策略,它在每一步选择列中的最大元素(主元素)进行行交换和标量乘法,以确保下三角矩阵的非零元素都在对角线上。 列主元素消去法的具体步骤如下: 1. **选择主元素**:对于矩阵A...
在计算机科学和数据分析领域,"主元素"(Majority Element)是一个重要的概念,尤其是在数据处理和算法设计中。主元素是指在给定的一组数字中出现次数超过数组长度一半的元素。如果存在这样的元素,那么它就是数组的...
主元素 线性选择算法主元素的判定(分治策略) 设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++代码,速度和精度都非常高! 示例中包含了算法的全部源代码以及详细的使用示例! // 高斯消元法 // 输入: // int NA 矩阵阶数 // double A[] 系数矩阵,将二维用一维...
Gauss主元素消去法的算法理论主要包括以下步骤: 1. **消元过程**:首先,从系数矩阵中选择第一行最大绝对值的元素,通过行交换使其成为首行的主元素。接着,通过行倍加操作消除下一行的对应元素,形成阶梯形矩阵。...
算法分析课程作业,C语言编写,可能需要用input.txt输入,主元素问题代码
在计算机科学中,主元素(Pivot Element)通常是指在排序或查找算法中起到关键作用的一个元素。在本文中,我们将深入探讨一个用C语言编写的主元素相关程序,特别是它如何进行时间复杂度分析,并关注线性情况。C语言...
请设计一个线性时间算法,判断input中的数据是否存在主元素。在实验报告中对算法时间复杂度作出分析。 输入:文件的第1行为数组S中元素个数n;接下来的n 行中,每行有一个自然数。程序运行结束时,将计算结果输出到...
总结起来,使用C语言和高斯主元素消去法解决线性方程组,需要理解算法原理,熟悉文件读写操作,以及掌握C语言的数组操作和函数设计。通过这个过程,不仅可以学习到数值计算的方法,还能提升编程技巧。
在MATLAB中,可以编写函数来实现这个算法,或者利用已内置的`lu`函数,它可以同时完成行变换和列主元素的选择,得到LU分解,再通过回带求解得到线性方程组的解。 总结起来,高斯列主元素消去法是一种针对数值稳定性...
- **列主元素选择**:在每一步迭代中,选择当前列中绝对值最大的元素作为主元,这有助于减少舍入误差,并提高算法的稳定性。 2. **C语言实现** - 在C语言中,可以使用二维数组表示矩阵,通过指针操作实现行变换。...
主元素问题: 设T[0..n-1]是n个元素的数组。对任一元素x,设S(x)={i|T[i]=x}。当|S(x)|>n/2时,称x为T的主元素。如果T中元素存在序关系,按分治策略设计并实现一个线性时间算法,确定T[0..n-1]是否有一个主元素。
- **交叉与变异操作**:遗传算法中交叉操作为主,变异操作为辅,以实现平稳的全局收敛;免疫算法中变异操作更为重要,以维持多样性,辅助交叉操作。 - **记忆库**:免疫算法引入了记忆库的概念,存储问题的解决方案...
主元素查找算法是针对数组中的一个整数序列,如果序列中有一个元素出现次数超过一半,称这样的元素为主元素。为了找到主元素,可以采用分治策略,对数组进行划分,递归找出左半部分和右半部分的主元素,然后根据两边...
- **主循环**:调用以上函数,执行算法的迭代过程。 蜻蜓算法的优点包括全局搜索能力、简单易实现、鲁棒性强等,但也有如收敛速度较慢、容易陷入局部最优等不足。通过调整参数和引入新的改进策略,如混沌、遗传、...
2. **找主元素的随机算法**: 主元素是指矩阵中最大或最小的元素。传统的线性搜索算法在大型矩阵中效率低下。随机化算法,如快速选择算法,可以通过随机抽取元素作为基准,然后将矩阵划分为小于、等于和大于基准的...
- `hw_1.cpp`:这是实际的C++源代码文件,其中实现了高斯列主元素消去法的算法。 在`hw_1.cpp`文件中,开发者可能定义了一个或多个函数来执行高斯消去过程。通常,算法会包括以下几个步骤: 1. **初始化**:创建一...