读书人

“多个数值比较”的算法解决方案

发布时间: 2013-07-16 22:38:05 作者: rapoo

“多个数值比较”的算法
现有一组数据(假设都是整数吧),总量不确定(当然数量不会太大的,比如最多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。
用基础语句来写,别用什么库里的“高级功能”。
算法
[解决办法]
数的范围大的话其实也可以用 C++ 库里的 std::map, 但是你又要求不使用这些库.
[解决办法]
数的范围不大,自己建个数据遍历一遍计数就行了。map是个好方法。
[解决办法]

引用
用基础语句来写,别用什么库里的“高级功能”。


简单点儿,那就用排序吧。
排序然后统计,用插入排序是O(N^2),用快速排序是O(N*Log(N)),用基数排序是O(N)
200条的数据量,插入排序也不慢太多。

想要找更快的算法,那就要先说明数据特点,实现一个低冲突的HashKey,然后进行计数统计就行了。
[解决办法]
计数排序计数部分,就可以了,如果数据范围不大的话。
如果数据量很小,比如200个无论怎么做,耗时也不多,O(N^2) 才40000*C 个(比较)操作。


[解决办法]
看来楼主VB方向对算法研究不算特别深入啊
[解决办法]
仅供参考
//有一个数组,存储的元素为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");
}

[解决办法]
没意思啊, 就是写个HASH表.
------解决方案--------------------


这类还是很有意思的。
看过一个叫“寻找水王”的,算法很巧妙。可惜只是类似,那个算法在这里不适用。
[解决办法]




map 的全部源代码都有的, 看它源代码就知道 “在背地里搞了些什么操作”.
其实它的实现也没什么秘密, 只是手动在去实现一遍实在没什么必要.
[解决办法]
使用map还不如先排序后统计。
如果用标准库实现的话,用unordered_map比较好,当然你要写一个优秀的hash函数。

如果不使用unordered_map,那就用sort先排序,然后再循环adjacent_find。

不要担心标准库的算法会“在背地里搞了些什么操作”,它肯定不会破坏你的数据,也不会把你的银行帐号密码公布到网上。

说实话,写一个没有bug又比std::sort更出色的排序实现还是比较麻烦的。

读书人网 >C++

热点推荐