C语言求数组中出现次数最多的数

数组大小为8192*8192,想要复杂度低一点的代码~... 数组大小为8192*8192,想要复杂度低一点的代码~ 展开
 我来答
百度网友ec9719df53
2015-05-08 · TA获得超过664个赞
知道小有建树答主
回答量:322
采纳率:95%
帮助的人:200万
展开全部
仔细思考了一下,不知道如何用O(n)的级别完成它,如果不要求O(n)的级别,可采用一下策略。
1,快速排序等等的可以在O(nlgn)完成的排序策略
2,对排序好的数据,以O(n)的方式遍历,例如 1 2 2 2 3 3 3 3 3 5 8 8 9 9 9 9
可以得到{1, 1} {2, 3} {3,5} {5, 1} {8, 2} {9, 4} 这可以用一个struct结构体存储,左边的是数值,右边的是此数值的个数
3,对结构体数组寻找右边的个数的最大值,可以看到{3,5}中的5是最大的,即可求出为1

如果限制了n个整数的每一个整数的范围,例如所输入的整数为0-255之间,那么这样就可以以O(n)的级别完成。
1,做一个256的数组,count[256],初始为0
2,遍历输入的数据,例如当前输入为8 ,那么执行 count[8]++;
3,遍历count数组,找到最大的count[i],那么i的值就是那个整数的值。

代码我就不贴了,毕竟我还有很多事情要做,而且编程是需要训练的,有了思路,实现就是一个时间和体力的问题了。

哎,比较失望。费了那么大的劲提供了O(n)和O(nlgn)的思路,还是被否决了,无语了都。你想用O(n^2)级别完成,或者想要直接的代码,我就不用费那么大的劲来阐述思想了。编程学的是思想,要的是体力劳动,不是copy。

last version 2013-05-28 15:28
this time update at 2015-05-08 13:44
今天上网看到这个回答有了44个赞同,还是略有些开心的。当年回答这个问题的时候还是在大学,年轻气盛,说了一些不该说的话,现在想来完全没有那个必要了。针对这个问题,现在看来又有一些其他的看法,希望能跟大家分享一下:
法1: 利用二叉排序树的思想,主要基于其O(logn)的查找效率。 从第1到第n个元素逐个遍历,并将元素插入到一个初始为空的二叉排序树中。在插入的过程中会有查找操作,如果此元素已经存在,则对其的count的属性增1, 如果不存在,就将其插入到二叉树中。插入的时间复杂度应该是O(lgn)级别,n个元素,应该是nlgn级别,其实可以在插入的时候始终记录最大count的那个值,插入完毕也就找到那个值了。
法2: 利用hash散列表的思想,注意散列函数不宜复杂,否则散列就得不偿失了。 将n个元素散列到一个hash表中,可以采用类似于链式hash的策略。在散列的过程中,对于具有相同的值的元素,只记录它的一个值和count,同时一直保持这最大count的值,这样当散列完毕,最大count对应的值也就得到了。
匿名用户
2014-12-31
展开全部
#include<stdio.h>
#include<string.h>
int max(int a,int b)
{
if(a>b)return a;
return b;
}
int main()
{
int n,i,a[1001],b[10001],maxn=0,ans,sum=0;
scanf("%d",&n);
memset(b,0,sizeof(b));
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
maxn=max(maxn,a[i]);
b[a[i]]++;
}
for(i=1;i<=maxn;i++)
if(sum<b[i]){ans=i;sum=b[i];}
printf("%d出现的次数最高。出现%d次",ans,sum);return 0;}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式