首页 新闻 会员 周边 捐助

如何从三亿个整数里面找出不重复的数字的个数

0
悬赏园豆:40 [已解决问题] 解决于 2011-10-19 21:14

如题:如何从三亿个整数里面找出不重复的数字的个数,只要计算个数就行,有什么好的思路?

要高时间效率和空间效率

行在途中的主页 行在途中 | 初学一级 | 园豆:116
提问于:2011-10-11 18:28
< >
分享
最佳答案
1

先排序,再遍历,前后均不相同则计数加1

收获园豆:20
邀月 | 高人七级 |园豆:25475 | 2011-10-11 20:27

排序得比较多少次啊。。。,效率太低了吧

行在途中 | 园豆:116 (初学一级) | 2011-10-11 21:44

@行在途中: 排序很快的

如果是使用HashSet<int>保存的话,每一个数字都要从中寻找,效率更低

Lionheart Zhang | 园豆:334 (菜鸟二级) | 2011-10-11 22:21
其他回答(5)
0

你是要结果还是要过程?

小小刀 | 园豆:1991 (小虾三级) | 2011-10-11 20:51

意思就是现在有一个三亿个整型数组,要你编程求出这个数组中没有重复出现的数字的个数。

支持(0) 反对(0) 行在途中 | 园豆:116 (初学一级) | 2011-10-11 21:47

@行在途中: 

你要结果就将数据放在数据库里面很快就会有结果,如果你要过程那就……

支持(0) 反对(0) 小小刀 | 园豆:1991 (小虾三级) | 2011-10-11 22:00
-1
Dictionary<int, int> dic = new Dictionary<int,int>(300000000);
for(int i=0; i<arr.Length;i++)
{
int count = dic[arr[i]];
count++;
dic[arr[i]]=count;
}
int norepeatCount = 0;//不重复的数字数量
foreach(var item in dic)
{
if(dic[item]==1)
{
norepeatCount++;
}
}
return norepeatCount;

时间复杂度为O(n),空间复杂度为O(n)

收获园豆:10
小彬 | 园豆:947 (小虾三级) | 2011-10-13 08:43

呵呵,其实这是腾讯的一道面试题,我当时的回答就是用的这种方法,但是那个面试官说:“你再想想,没有更好的办法了吗?”,我没想出来,所以来网上问问有没有更好的思路。

比如说说像【约瑟夫环】,当我只要求出最后一个出圈的编号时,就只要写下面的代码就可以了

(来源:http://www.cnblogs.com/EricYang/archive/2009/09/04/1560478.html

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int n, m, i, s = 0;
 5     printf ("N M = ");
 6     scanf("%d%d"&n, &m);
 7     for (i = 2; i <= n; i++)
 8     {
 9         s = (s + m) % i;
10     }
11     printf ("\nThe winner is %d\n", s+1);
12 }
支持(0) 反对(0) 行在途中 | 园豆:116 (初学一级) | 2011-10-13 09:41

@行在途中: 

可以用优先队列来实现

支持(0) 反对(0) 小彬 | 园豆:947 (小虾三级) | 2011-10-20 15:17
0

还在迷糊啊,答案就在那里,排序的确会比较很多次,而且int类型比较速度也很快

如果是遇到不存在的就存储起来,看起来比较次数是少了,但是索引器里面是要查找的,不管是Dictionary还是Hashset本质都是一样的,当样本非常大的时候占用的资源也是可观的

既然对答案有疑惑,那就自己动手随机生成3亿个数字试试每种方法吧,反正也不费劲,排序速度可是有着绝对优势呢

收获园豆:10
Lionheart Zhang | 园豆:334 (菜鸟二级) | 2011-10-19 17:07
0

这么大的数据使用哈希表,需要很大的表空间,才能减少地址冲突,但冲突的数量还是很可观的。

我觉得这问题可以用二叉平衡搜索树来解决,如AVL树或者红黑树。

一个结点的结构可以如下:

public class AVLNode
{
public Key key;
public T value;
public sbyte balance;
public AVLNode left;
public AVLNode right;
}

一个结点大概136b,

最多3亿个节点408 0000 0000 b 约等于38M,

也就是说空间上大概40M;

而AVL插入一个元素(插入时便已经排序)的时间复杂度为O(logn),

总的时间复杂度为O(nlogn),

3亿个节点,所以计算的次数大概为3亿乘以一个不大的常数(log3 0000 0000大概为10)。

这个空间,和时间都可以接受。

==》得解:)

 

忘了加上解所获得的方式:

分别把3亿个数字加人AVLTree中(红黑树也可),相同数的不会加进去(这是AVLTree的内置机制),加完后AVL的节点数便是解。

提示:二叉平衡搜索树在C++的STL和java的集合库中有已经实现好的类,.Net据我所知还没有官方的实现:(        自己看着办吧

拾玄 | 园豆:439 (菜鸟二级) | 2011-10-29 19:35

3亿才38M?开啥玩笑啊。

支持(0) 反对(0) rockZ | 园豆:200 (初学一级) | 2015-03-03 21:06

@rockZ: 

当时算错了,单位应该是G,38G

支持(0) 反对(0) 拾玄 | 园豆:439 (菜鸟二级) | 2015-03-04 09:24
0

表示怀疑,不可以用sql语句来么?

iisp | 园豆:81 (初学一级) | 2012-03-14 16:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册