问题的提出:
如何判断一个数是否在40亿个整数中?
问题的解决方案:
1、分钟级方法:用一个map集合来存储数据,新的数判断是否在map集合中。
2、分钟级方法:使用set集合来存储数据,新的数判断是否在set集合中。此时如果整数为32位,那么set集合就需要占用大约16G的空间。
3、秒级方法:使用分布式将数据分在8个机器上,然后同时查找,返回是否存在。
4、毫秒级方法:32位int的范围,总共就是2的32次方,大概42亿多点。所以你可以申请2的32次方个位。40亿个数中,存在的数就在相应的位置1,其他位就是0。新的数就去找相应的位,比如来了一个1234,就找一下第1234位,如果是1就存在,是0就不存在啦。此时2的32次方个位,相当于2的29次方个字节,才500MB,真是节省了不少内存呢。其实这是一种非常有名的大数据算法,叫位图法,英文名叫bitmap。顾名思义,就是用位来表示状态,从而节省空间。
5、首先,32位int的范围是42亿,40亿整数中肯定有一些是连续的,我们可以先对数据进行一个外部排序,然后用一个初始的数和一个长度构成一个数据结构,来表示一段连续的数,举个例子。如果数据是1 2 3 4 6 7……这种的,那么可以用(1,4)和(6,2)来表示,这样一来,连续的数都变成了2个数表示。来了一个新数之后,就用二分法进行查找了。这样一来,最差情况就是2亿多的断点,也就是2亿多的结构体,每个结构体8个字节,大概16亿字节,1.6GB,在内存中可以放下。