寻找主元素(高效算法)
来源:互联网 发布:淘宝 折扇 编辑:程序博客网 时间:2024/05/22 16:05
关于这种主元素还有种更加巧妙地方法,没看到过一定想不到的。这种方法的原理是如果一个数组中存在一个主元素(个数大于n/2),如果两个不相等的元素两两抵消,那么最终一定剩下的是主元素。
简单的说就一个大小为n数组中存在一个元素的个数大于n/2,则如果用这个数组中其他元素和该主元素进行抵消的话,最后剩下的一定是主元素,因为主元素个数最多。
该方法可以在O(n)的时间内找到主元素,十分高效。
REF:
简单的说就一个大小为n数组中存在一个元素的个数大于n/2,则如果用这个数组中其他元素和该主元素进行抵消的话,最后剩下的一定是主元素,因为主元素个数最多。
该方法可以在O(n)的时间内找到主元素,十分高效。
代码:
int major_element(int A[],int n){/* non-negative returned if major element exist. */int seed = A[0];int cnt = 1;int p;for (int i=1;i<n;i++){if(seed == A[i])cnt++;elseif(cnt>0) cnt--;else seed = A[i];}cnt = 0;for(int i=0;i<n;i++)if(A[p=i] == seed) cnt++;if(cnt>(n>>1))return p;return -1;}如果存在主元素,那么最终的seed一定指向主元素。测试代码:
void main(){int a[] = {1,5,2,5,3,5,4,5,5};printf("Major elem exists in a?: %s \n",major_element(a,9)>-1?"Yes!":"No!");printf("Major elem is: %d \n",a[major_element(a,9)]);int b[] = {1,2,3,4,4,4,4,5};printf("Major elem exists in b?: %s \n",major_element(b,8)>-1?"Yes!":"No!");}测试输出:
Major elem exists in a?: Yes! Major elem is: 5 Major elem exists in b?: No!
REF:
1,http://blog.csdn.net/fatshaw/article/details/6300786
0 0
- 寻找主元素(高效算法)
- 寻找多数元素 算法
- 算法 寻找多数元素
- 【算法分析】寻找多数元素
- 寻找主元素
- 寻找主元素
- 寻找主元素
- 寻找主元素
- 寻找主元素问题
- 寻找主元素
- 寻找主元素
- 寻找主元素
- 算法:寻找第K小元素
- 小算法----寻找插入元素的位置
- 寻找数组中的主元素
- 寻找多数元素/主元素问题
- 寻找多数元素(主元素)
- 字符串元素重排高效算法集合
- 近期处理的oracle问题汇总
- Delphi中ClientDataSet浅析
- Logistic回归(一)分类
- Delphi中ClientDataSet的数据查找
- 不依赖Excel是否安装的Excel导入导出类
- 寻找主元素(高效算法)
- java多态中,父类属性的继承
- Configuring Magento for Development / Debug Mode
- android ViewHolder模式超简洁写法
- 06 - 数据操作二:sqlite数据库与listview显示
- hdu1015
- 前端那些事儿——中文乱码,网页中文乱码,网页乱码,块元素,内联元素
- Spring IOC
- 黑马程序员-day21-IO流(字符编码)