一个int类型的数组 里面有一万个int数字 如何用循环算出有多少对相同的数字 假设相同数字全都只有一对

匿名网友 匿名网友 发布于: 2016-06-23 00:00:00
阅读 156 收藏 0 点赞 0 评论 0

用bitmap算法,O(n),就可以实现,当然hash也可以实现,只不过hash算法要设计好,不能有冲突。这道题数据量还是太小,用hashtable更合适,如果数据量再大就用bitmap更合适了。

因为数字为int,而有符号的int最大值为23亿,unsigned int最大为42亿多,假设题目是有符号的,则建立一个23亿大小的bit数组,转为成int数组即为(23亿/32 + 1)长度(int为4字节,32bit位),内存消耗为23亿/8/1024/1024大约等于271M,内存完全可以满足。因为题目要求只统计相同的对数。所以在设置一个统计的变量sum。假如该bit位上值为1,说明之前有过该值了。

下面是bitmap算法的举例说明:

所谓的bitmap就是用一个bit位来标记某个元素对应的value,而key则是该元素。由于 采用bit为单位来存储数据,因而可以大大节省内存空间,因此bitmap多用于对打数据上。 下面通过一个例子来了解bitmap:

假设我们要对0-7内5个数(4,2,2,3,3)统计重复,那么我们可以用bitmap来实现。 首先我们用普通方法表示这个5个数,我们需要5byte。再来看看用bitmap来表示,因为 数值范围为0-7,即最多8个数,则只需要8bit,即为1byte。具体方法如下:

1、首先分配1byte空间,所有bit位赋值0,如下: 

 

00000000

2、然后遍历这5个数,第一个数为4,则把第4个bit位赋值1 

 

00010000(从0计数,从右往左)

3、以此类推,剩余计算过程如下:

   00010100(第二个数2)

   00010100(第三个数2,因为该位已经为1,所以sum++)

   00011100(第四个数3)

   00011100(第五个数3,该位已经为1,sum++)

 

最后sum为2,即重复数字对数。时间复杂度为O(n),内存占用量为270M左右。

评论列表
文章目录