ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

主元素问题与摩尔投票法、格雷码

2022-09-03 19:31:54  阅读:196  来源: 互联网

标签:lfloor 格雷 cnt int 元素 摩尔 投票 ans


一堆小玩意,放到一起。

题意:给定一个n个元素数列,保证有一个数\(a\)的出现次数超过\(\lfloor\frac n2 \rfloor\),求这个数。

数据范围\(n<=3000000,a_i\le2147483647,\)时限0.5s,空间2M。

也就是说你就只开几个变量就行了。(虽然考试的时候有人拿hash玄学乱搞过了)

首先这个时间卡掉了排序,空间和数据范围卡掉了桶的做法。我们考虑利用“数\(a\)的出现次数超过\(\lfloor\frac n2 \rfloor\)”这个特性。

我们发现(反正我没发现我太弱了55555)如果两两删去两个不同的元素,最后剩下的一定是元素\(a\)。证明考虑最坏的情况,所有其他元素一起来删掉\(a\),那么由于\(a\)的个数超过一半,一定可以删掉其他所有的元素而自身有保留元素。

于是我们就得到了一种\(O(n)\)模拟的方法,而且只需要四个\(int\)变量:\(n\),输入的\(x\),计数器\(cnt,ans\)。具体地,我们每次输入一个数的时候,进行如下操作:

  1. 如果\(cnt=0\),则用\(x\)更新\(ans\),将\(cnt\)设为\(1\)。
  2. 如果\(x\ne ans\),则将当前计数器\(cnt-1\)。(也就是用不同的元素互相消去)
  3. 反之\(cnt+1\)。(也就是统计相同的元素个数)

依题意模拟即可。

scanf("%d",&n);
while(n--){
	int x;scanf("%d",&x);
	if(ans!=x){
		if(--cnt<=0)ans=x,cnt=1;
	}
	else cnt++;
}

反正我觉得不会考,但是考了就考了吧。


格雷码是一个二进制数系,其中两个相邻数的二进制位只有一位不同。

给出手动构造方法:

  1. 翻转最低位得到下一个格雷码。
  2. 翻转最右边的1的左边一位得到下一个格雷码。

交替操作1,2共\(2^{k-1}\)次可得到k位的格雷码序列。举个例子,3位格雷码序列为:

\[000,001,011,010,110,111,101,100 \]

注意我们说的格雷码下标是从0开始的,即\(G(0)=000,G(4)=110\)。

然后是计算法:第\(n\)位格雷码为:

\[G(n)=n \oplus \lfloor\frac n2\rfloor \]

int g(int n){
	return n^(n>>1);
}

然后是它的逆变换。\(n\)的二进制第\(i\)位与其格雷码\(g\)的二进制第\(i\)位的关系(最高位为\(k\)):

\[n_{k-i}=\bigoplus_{j=0}^ig_{k-j} \]

int getn(int g){
	int n=0;
	for(;g;g>>=1)n^=g;
	return n;
}

标签:lfloor,格雷,cnt,int,元素,摩尔,投票,ans
来源: https://www.cnblogs.com/gtm1514/p/16653366.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有