寻找主元素(高效算法)
2014-06-24 21:09
288 查看
关于这种主元素还有种更加巧妙地方法,没看到过一定想不到的。这种方法的原理是如果一个数组中存在一个主元素(个数大于n/2),如果两个不相等的元素两两抵消,那么最终一定剩下的是主元素。
简单的说就一个大小为n数组中存在一个元素的个数大于n/2,则如果用这个数组中其他元素和该主元素进行抵消的话,最后剩下的一定是主元素,因为主元素个数最多。
该方法可以在O(n)的时间内找到主元素,十分高效。
代码:
REF:
1,http://blog.csdn.net/fatshaw/article/details/6300786
简单的说就一个大小为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++; else if(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
相关文章推荐
- 寻找链表中间节点—一种高效的算法
- 寻找链表中间节点-一种高效的算法
- 寻找链表中间节点-一种高效的算法
- 【算法】寻找数组中出现的唯一重复的一个数
- 高效算法设计专项:UVa 10730
- 推荐系统:技术、评估及高效算法 第15章
- iOS实现高效裁剪图片圆角算法教程
- 图论——寻找无向连通图割点算法
- N皇后问题:基于局部搜索策略的高效算法
- 常见面试算法题:给定数组中寻找加和为特定数的两个数
- 八数码路径寻找算法
- 算法竞赛入门经典:第八章 高效算法设计 8.5二分查找
- 何海涛算法面试题感悟之九:寻找链…
- 【高效算法设计】1609 Building for UN
- 数据结构与算法--图论之寻找连通分量、强连通分量
- 浅谈部分搜索+高效算法在搜索问题中的应用 by 楼天城
- 妙趣横生算法 3:寻找相同元素的指针
- java地图路径染色寻找算法
- 寻找代表元(匈牙利算法)
- 算法:寻找丢失的数 I & II