需要深入研究数据结构和算法算法那些事

【面试现场】(2)如何判断一个数是否在40亿个整数中?

2019-05-18  本文已影响252人  hedgehog1112

题目:我有40亿个整数,再给一个新的整数,我需要判断新的整数是否在40亿个整数中,你会怎么做?

为什么我说分8次加载数据太慢了呢?

从磁盘加载数据是磁盘io操作,是非常慢的,你每次都要加载这么大的数据,还要8次,我估计你找一个数的时间可以达到分钟甚至小时级了。

把数据分散在8台机器上,然后来一个新的数据,8台机器一起找,最后再汇总结果就行了。

【更好毫秒级方法】

小史:申请40亿个位就好了,新的数转换成一个位,然后判断一下这个位是0还是1就行了。

吕老师:小史啊,考虑问题要考虑清楚啊,如果是40亿个位,那么这40亿个位哪些是0,哪些是1呢?来了一个新的数,怎么判断是否在40亿个位之中?

小史:我想想,对啊,40亿个位,40亿个数,那么每个位都是1,这。。。

吕老师:32位int的范围,总共就是2的32次方,大概42亿多点。所以你可以申请2的32次方个位。

小史:意思是我把整个整数范围都覆盖了,哦,对哦。这样一来,就可以做了,1代表第一个位,2代表第二个位,2的32次方代表最后一个位。40亿个数中,存在的数就在相应的位置1,其他位就是0。

小史:新的数就去找相应的位,比如来了一个1234,就找一下第1234位,如果是1就存在,是0就不存在啦。2的32次方个位,相当于2的29次方个字节,哇,才500MB,真是节省了不少内存呢。

大数据算法,叫位图法,英文名叫bitmap用位来表示状态,从而节省空间

另一个方法:

32位int的范围是42亿,40亿整数中肯定有一些是连续的,先外部排序,用一个初始的数和一个长度构成一个数据结构,来表示一段连续的数,举个例子。

1 2 3 4 6 7用(1,4)和(6,2)表示,变成了2个数表示。来新数用二分法查找

最差情况就是2亿多的断点,也就是2亿多的结构体,每个结构体8个字节,大概16亿字节,1.6GB,在内存中可以放下。

给出了方案,还能主动分析空间和可行性。

上一篇下一篇

猜你喜欢

热点阅读