海量數據處理(二) 位圖

    位圖就是用一個bit爲來標記某個元素對應的valuekey是元素,構成鍵值對。由於使用了bit這個最小單位,所以能夠極大的節省內存。

 

    很簡單的一個例子,比如現在要對從含有1~100的無序不重複數組排序,那麼我們可以申請一個大小爲2^7bit的數組(也就是128bit,合16個字節,有一些內存浪費),將其所有置爲0。遍歷這個無序數組,bit[ arr[i] ] = 1。最後遍歷bit數組,寫入文件。

 

當然,如果存在着重複現象,位圖就不能夠使用了。

 

 

難度提高,如果現在給10^7個數據,要求排序,並且內存只給了1M,並且時間越快越好。又該怎麼處理呢?


    很明顯,內存只給1M,並且對時間有要求,普通的堆排歸併排是難以實現的,因爲往磁盤裏寫入文件就要花費很長時間。所以,我們既要縮小內存使用,又要減小往磁盤裏寫入次數。方法依舊是申請內存,但是10^7 /8/1024/1024 = 1.2M,超過了限定的1M,所以,我們還得繼續分。把10^7個數據分成兩塊,那就是1.2M/2=0.6M,排序後輸出。第二次也是如此處理(使用同一塊內存),最後再兩路歸併寫入文件裏,就實現了排序。

 

 

繼續討論,如果選擇有5E個整數,現在要求找出不重複的數。那又該怎麼做呢

 

    此時,一個位已經不能夠滿足 不存在,出現一次,出現多次這三種情況。所以我們選擇使用00(不存在)  01(出現一次)  10(出現多次)來表達。

    假定選擇給1G內存處理,那麼1G = 2^30 BYTE = 2^30*8 BIT = 2^32*2  (最後的2代表使用兩位表示一個數據),2^32超過5E,所以夠用了。

 

開闢內存後,將其所有置爲0,遍歷一遍,往裏面添,遍歷結束以後再遍歷一遍,把爲01的寫入文件裏。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章