打印

一个数组中有N个元素,找出其中重复次数最多的那个元素?

[复制链接]
5343|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
henrygliet|  楼主 | 2007-7-22 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前在CSDN上提过类似的问题,就是:一个数组中有N个元素,找出其中重复次数最多的那个元素?原来的问题的假设条件是***没有重复次数相同的两个不同元素***,例如{1,1,2,2,4,4,4,4,5,5,6,6,6},就是要找出4,之前CSDN上的一位大侠提供了一种算法,虽然不一定是最好的,但是对于我却是实用的。 
    但是我现在得到的原始数组中***存在重复次数相同的两个不同元素***,例如{1,1,2,2,2,3,3,3,4,4,4},这样的话就需要把2,3,4都找出来。而CSDN上的大侠提供的算法就不是很好了。并且数组中的情况是不确定的,也有可能是{1,1,1,2,2,3,3,3},所以算法要有一定的通用性。 
    另外,数组中的元素是任意顺序的,也就是没有经过排序的,如果这样难以实现的话,可以先实现已经排序了的,就像我举出的例子那样。 
    最后还有一点要说明的是,最好使用C实现的,不要用C++,因为这个算法我最终是要移植到嵌入式系统中的,有些东西不支持,我之前让一个朋友写过一个算法,可是里面用到了new和delete这样的关键字,是我的系统不支持的,所以就来麻烦各位大侠了,小弟谢谢先~~~ 

相关帖子

沙发
henrygliet|  楼主 | 2007-7-22 21:28 | 只看该作者

贴上CSDN上大侠的代码,给大家参考下:

 

#include <stdlib.h> 
#include <stdio.h> 

#define M 100// 当前用于统计的数字数目 

int nSeed[M] = {};// 存储用来进行统计的数组 
int nMaxNum = 0;// 存储当前出现次数最多的那个数字 
int nRepetitionCount = 0;// 出现次数最多的数字的重复次数 
int nCount = 0;// 辅助计数 

int main(void) 

// 随机赋值 
for (int i = 0; i < M; i++) 

nSeed = rand() % 25; 


// 先检查0的情况,0作为一个特殊数字来作标记 
nMaxNum = 0; 
for (int i = 0; i < M; i++) 

if ( !nSeed

nRepetitionCount++; 



// 从后面往前面查 
for (int i = M - 1; i > nRepetitionCount; i--) 

// 0则过,已统计过 
if ( !nSeed

continue; 


// 找到一个新数字,进行统计 
nCount = 1; 
for (int j = i - 1; j > 0; j--) 

if (nSeed[j] == nSeed

nCount++; 
nSeed[j] = 0;// 置为0,表示已统计过 



// 判断当前是否为最大 
if (nCount > nRepetitionCount) 

nMaxNum = nSeed
nRepetitionCount = nCount; 



printf("出现次数最多的数是%d,出现%d次! ", nMaxNum, nRepetitionCount); 
getchar(); 

return 0; 
}; 

使用特权

评论回复
板凳
xwj| | 2007-7-22 21:43 | 只看该作者

你必须的先明确数值范围和数组大小,才能正确优化

你也可以参考 JPEG编码中哈夫曼编码里的 概率统计那一段

使用特权

评论回复
地板
wtfshxkj| | 2007-7-23 07:29 | 只看该作者

醍醐灌顶

 See see

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

89

帖子

1

粉丝