這兩天看博客園首頁一篇文章,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億,百億甚至更多怎麼辦呢?
很簡單,存在數據庫裏面嘛,一個表倆字段(序號+值)便可,建個索引,很容易就能支持海量數據的處理了,這樣擴展性的問題也就解決了。
一時興起寫的,排版請見諒。歡迎你們討論。