“多个数值比较”的算法

舉杯邀明月 2013-07-11 12:39:35
现有一组数据(假设都是整数吧),总量不确定(当然数量不会太大的,比如最多200个)。

要求:
  找出这组数里面的值相等的、个数最多的那个。
  要求得到值是多少?有几个相等(如果没有相等的,个数就是0)?


举例:
  数据:1,2,3,4,5,6,7,8,9
  结论是“0个相等。”
  数据:1,5,3,7,7,3,5,4,5,6
  结论是“3个相等,值为5”

  假设把第二组数的其中一个5换成9,则:“2个相等,值为5(或3、或7,都可)”


把数据排序后来找的算法,就不必说了。
我想看看哪个大神有没有直接查找找、效率更高的巧妙算法。


代码语言限制为C/C++,或者VB。
用基础语句来写,别用什么库里的“高级功能”。
...全文
371 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
氰客 2013-07-11
  • 打赏
  • 举报
回复
数的范围不大,自己建个数据遍历一遍计数就行了。map是个好方法。
www_adintr_com 2013-07-11
  • 打赏
  • 举报
回复
数的范围大的话其实也可以用 C++ 库里的 std::map, 但是你又要求不使用这些库.
www_adintr_com 2013-07-11
  • 打赏
  • 举报
回复
数的范围大吗? 不大的话直接用个数组来做 map 映射. 遍历一遍也就找到了.
舉杯邀明月 2013-07-11
  • 打赏
  • 举报
回复
我先坐沙发上,来看大神回答。
橡木疙瘩 2013-07-11
  • 打赏
  • 举报
回复
使用map还不如先排序后统计。 如果用标准库实现的话,用unordered_map比较好,当然你要写一个优秀的hash函数。 如果不使用unordered_map,那就用sort先排序,然后再循环adjacent_find。 不要担心标准库的算法会“在背地里搞了些什么操作”,它肯定不会破坏你的数据,也不会把你的银行帐号密码公布到网上。 说实话,写一个没有bug又比std::sort更出色的排序实现还是比较麻烦的。
www_adintr_com 2013-07-11
  • 打赏
  • 举报
回复
引用 9 楼 Chen8013 的回复:
[quote=引用 3 楼 adlay 的回复:] 数的范围大的话其实也可以用 C++ 库里的 std::map, 但是你又要求不使用这些库.
数值范围是32bit、带符号整数 的全部范围啊。 用库里的东西,只是程序代码看起来比较简洁罢了。 但不知道它“在背地里搞了些什么操作”。 [/quote] map 的全部源代码都有的, 看它源代码就知道 “在背地里搞了些什么操作”. 其实它的实现也没什么秘密, 只是手动在去实现一遍实在没什么必要.
大尾巴猫 2013-07-11
  • 打赏
  • 举报
回复
不用动太多脑筋的话,直接循环计数,反正最多200个数据。也不会慢到哪里。 复杂点的做个HASH,效率高。
阿麦 2013-07-11
  • 打赏
  • 举报
回复
这类还是很有意思的。 看过一个叫“寻找水王”的,算法很巧妙。可惜只是类似,那个算法在这里不适用。
qq120848369 2013-07-11
  • 打赏
  • 举报
回复
没意思啊, 就是写个HASH表.
舉杯邀明月 2013-07-11
  • 打赏
  • 举报
回复
8F的代码,跟我的要求来说,差距还比较大。 那个只是判断了有没有出现重复的值。 我的是要找出哪个值重复次数最多、它的值是多少。
舉杯邀明月 2013-07-11
  • 打赏
  • 举报
回复
引用 3 楼 adlay 的回复:
数的范围大的话其实也可以用 C++ 库里的 std::map, 但是你又要求不使用这些库.
数值范围是32bit、带符号整数 的全部范围啊。 用库里的东西,只是程序代码看起来比较简洁罢了。 但不知道它“在背地里搞了些什么操作”。
赵4老师 2013-07-11
  • 打赏
  • 举报
回复
仅供参考
//有一个数组,存储的元素为1到10000000的任意数,在其中查找出一个重复的数字
#include <stdio.h>
int a[3]={1,10000000,10000000};
static unsigned char b[10000000/8+1];
int i;
void main() {
    for (i=0;i<3;i++) {
        if (b[a[i]/8]&(1<<(a[i]%8))) break;
        else b[a[i]/8]|=(1<<(a[i]%8));
    }
    if (i<3) printf("%d\n",a[i]);
    else     printf("Can not find.\n");
}
derekrose 2013-07-11
  • 打赏
  • 举报
回复
看来楼主VB方向对算法研究不算特别深入啊
lm_whales 2013-07-11
  • 打赏
  • 举报
回复
计数排序计数部分,就可以了,如果数据范围不大的话。 如果数据量很小,比如200个无论怎么做,耗时也不多,O(N^2) 才40000*C 个(比较)操作。
橡木疙瘩 2013-07-11
  • 打赏
  • 举报
回复
引用
用基础语句来写,别用什么库里的“高级功能”。
简单点儿,那就用排序吧。 排序然后统计,用插入排序是O(N^2),用快速排序是O(N*Log(N)),用基数排序是O(N) 200条的数据量,插入排序也不慢太多。 想要找更快的算法,那就要先说明数据特点,实现一个低冲突的HashKey,然后进行计数统计就行了。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧