如何判斷一個元素在億級數據中是否存在? 很難嗎...


這兩天看博客園首頁一篇文章,https://www.cnblogs.com/crossoverJie/p/10018231.html

主要是分析一個面試題:

現在有一個非常龐大的數據,假設全是 int 類型。現在我給你一個數,你需要告訴我它是否存在其中(盡量高效)。

雖然文章給的布隆過濾器不能解決面試的這個題的問題,判斷不存在和判斷存在是兩碼事。

 

下面給出我的思路,歡迎大家討論分析。

先假定有1億個正整數,如何處理。如何初始化這1億個數,使得來一個數就能快速分析出結果呢?

很直觀的一種方法就是某個數存在就給它標記為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億,百億甚至更多怎么辦呢?

很簡單,存在數據庫里面嘛,一個表倆字段(序號+值)即可,建個索引,很容易就能支持海量數據的處理了,這樣擴展性的問題也就解決了。

 

一時興起寫的,排版請見諒。歡迎大家討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM