寻找主元素(高效算法)

来源:互联网 发布:淘宝 折扇 编辑:程序博客网 时间:2024/05/22 16:05
        关于这种主元素还有种更加巧妙地方法,没看到过一定想不到的。这种方法的原理是如果一个数组中存在一个主元素(个数大于n/2),如果两个不相等的元素两两抵消,那么最终一定剩下的是主元素。
简单的说就一个大小为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
原创粉丝点击