寻找主元素(高效算法)

        关于这种主元素还有种更加巧妙地方法,没看到过一定想不到的。这种方法的原理是如果一个数组中存在一个主元素(个数大于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


  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值