您的位置:首页 > 其它

寻找主元素(高效算法)

2014-06-24 21:09 288 查看
关于这种主元素还有种更加巧妙地方法,没看到过一定想不到的。这种方法的原理是如果一个数组中存在一个主元素(个数大于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++;
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: