如何判断一个元素在亿级数据中是否存在? 很难吗...

这两天看博客园首页一篇文章,https://www.cnblogs.com/crossoverJie/p/10018231.htmlhtml

主要是分析一个面试题:面试

如今有一个很是庞大的数据,假设全是 int 类型。如今我给你一个数,你须要告诉我它是否存在其中(尽可能高效)。数据库

虽然文章给的布隆过滤器不能解决面试的这个题的问题,判断不存在和判断存在是两码事。数组

 

下面给出个人思路,欢迎你们讨论分析。htm

先假定有1亿个正整数,如何处理。如何初始化这1亿个数,使得来一个数就能快速分析出结果呢?blog

很直观的一种方法就是某个数存在就给它标记为1,不然标记为0,先假定有一个int.Max长的数组,每一个数的值放到它的序号上,好比第一个数是5,那么就在第5位置1,其他相似。索引

若是用int数组,这样的话,这个数组就很长了,内存可能吃不消。内存

其实0、1这样的用比特存储就刚恰好,那么每8位的比特合在一块儿,就是一个byte,每个byte加一个序号(表示是第几个8位)就能表示8个数是否存在了。那么若是用byte数组长度就是:1亿/ 8 = 12500000长的byte数组便可,这个数组的序号就是第N*8-N*8+8个数的分布状况。好比要查100是否存在这1亿数据中,对100除8取结果和余数,结果肯定序号,判断序号对应的数的二进制在余数位是否为1便可。博客

同理,用int能够存32个数,就是1亿/32长的int数组;用long能够存64个数,就是1亿/64长的long数组便可。扩展

不管是用byte、int仍是long数组,大小都查不到,约: 1亿/ 32 * 4 / 1024 / 1024 ≈ 12(MB),也就是说用这么一点内存便可解决问题。

对于负数的处理,无非再用一个数组来存下便可。

那么若是数据多于1亿,好比10亿,百亿甚至更多怎么办呢?

很简单,存在数据库里面嘛,一个表俩字段(序号+值)便可,建个索引,很容易就能支持海量数据的处理了,这样扩展性的问题也就解决了。

 

一时兴起写的,排版请见谅。欢迎你们讨论。

相关文章
相关标签/搜索