首页 > 编程知识 正文

样本众数怎么求,找众数算法

时间:2023-05-03 16:54:29 阅读:118462 作者:4079

众数定义:

是一组数据中出现次数最多的数值,称为众数,有时众数在一组数中有好几个。 用m表示。 合理理解:简单来说,是一系列数据中数量最多的。

例题:

剧中的比赛全世界的大学生都参加了号码-10^9到10^9。 请不要问我是否可以坐在体育场里。 这是全世界的同期比赛,结果总结出来了。 主题数量总共可以达到10万个。 给你问题数n和n个号码。 每个号码都是第一个出现该问题的参与者的号码,求出出现次数最多的号码和次数,次数相同,输出号码最小。 具体格式请参照示例。

Input输入包含多个测试数据

每组测试数据的第一行中,数字n表示问题数(0n=100000 ),然后n个整数表示第一个创建问题的参与者编号。 每个编号在[-10 ^ 9,10 ^9]中为每组测试数据输出两个Output,分别表示出现次数最多及其出现次数。 (相同次数有多个时,输出最小)

sample input 512123 sample output 12显而易见,这是一个在有限数组中寻找众数的演习问题,由于数量范围太大,不能用“桶的思想”解决这个问题。 但是,众数和其数量出现的次数被认为是一一对应的,此时,可以考虑用一个结构体来容纳这种一对一的关系,如下所示。

结构节点{ ll value; int length; (;

这里,value是数组中的某个数,length是该数在数组中出现的次数。

这样,为了减少重复遍历的次数,只需按升序对数组进行排序,然后遍历一次数组,就可以记录每个数字出现的次数,并通过不断改变要记录的标志来更新结构数组的值。 我们可以采取以下方法。

sort(num,num n ); ll flag=num[0],j=0,temp=0,max_num=num[n-1],I; //flag表示记录的标志for(I=0; i n; I(if ) num[I]!=flag () { flag=num[i]; ans[j].value=num[i-1]; ans[j].length=i - temp; temp=i; j; }}ans[j].value=num[i-1]; ans[j].length=i - temp;

这里需要注意的一个问题是,如果遍历到最后的数而无法进行if判断,则从循环中跳出来,因此无法记录最后的数字或者最后出现的数字的次数,所以也预先记录在循环之外最后出现的数字的次数。 然后,在记录了所有数字后,将结构体数组按数字出现次数的降序排序即可,如果数字出现次数相同,则将更小的数字排列在上位。 因此,完整的代码如下所示。

# include cstdio # includealgorithmusingnamespacestd; 泰普德夫龙龙LL; 类型结构节点; 常数int maxn=1e 5; 结构节点{ ll value; int length; (; ll num[maxn 10]; BOLCMP(nodea,Node b ); int main () { int n; while(scanf('%d ',n )==1 n ) { Node ans[maxn 10]; for(intI=0; i n; I ) Scanf('%lld ',num[i]; sort(num,num n ); ll flag=num[0],j=0,temp=0,max_num=num[n-1],I; //flag表示记录的标志for(I=0; i n; I(if ) num[I]!=flag () { flag=num[i]; ans[j].value=num[i-1]; ans[j].length=i - temp; temp=i; j; } } ans[j].value=num[i-1]; ans[j].length=i - temp; sort(ans,ans j 1,cmp ); printf(%lld%d(n ),ans[0].value,ans[0].length ); }返回0; }boolCMP(nodea,Node b ) if ) a.length==b.length ) { return a.value b.value; } else return a.length b.length; }

时间和内存成本:

Time:73 ms毫秒

Memory:3320 kb

如有错误,还请指正,O(_)O谢谢

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。