海量資料處理之雙層桶劃分

2021-06-08 09:22:35 字數 1830 閱讀 2973

什麼是雙層桶

事實上,與其說雙層桶劃分是一種資料結構,不如說它是一種演算法設計思想。面對一堆大量的資料我們無法處理的時候,我們可以將其分成乙個個小的單元,然後根據一定的策略來處理這些小單元,從而達到目的。

適用範圍     

第k大,中位數,不重複或重複的數字

基本原理及要點     

因為元素範圍很大,不能利用直接定址表,所以通過多次劃分,逐步確定範圍,然後最後在乙個可以接受的範圍內進行。可以通過多次縮小,雙層只是乙個例子,分治才是其根本(只是「只分不治」)。

擴充套件      

當有時候需要用乙個小範圍的資料來構造乙個大資料,也是可以利用這種思想,相比之下不同的,只是其中的逆過程。

問題例項    

1).2.5億個整數中找出不重複的整數的個數,記憶體空間不足以容納這2.5億個整數。

有點像鴿巢原理,整數個數為2^32,也就是,我們可以將這2^32個數,劃分為2^8個區域(比如用單個檔案代表乙個區域),然後將資料分離到不同的區域,然後不同的區域在利用bitmap就可以直接解決了。也就是說只要有足夠的磁碟空間,就可以很方便的解決。當然這個題也可以用我們前面講過的bitmap方法解決,正所謂條條大道通羅馬~~~

2).5億個int找它們的中位數。

關於中位數:資料排序後,位置在最中間的數值。即將資料分成兩部分,一部分大於該數值,一部分小於該數值。中位數的位置:當樣本數為奇數時,中位數=(n+1)/2 ; 當樣本數為偶數時,中位數為n/2與1+n/2的均值(那麼10g個數的中位數,就第5g大的數與第5g+1大的數的均值了)。

這個例子比上面那個更明顯。首先我們將int劃分為2^16個區域,然後讀取資料統計落到各個區域裡的數的個數,之後我們根據統計結果就可以判斷中位數落到那個區域,同時知道這個區域中的第幾大數剛好是中位數。然後第二次掃瞄我們只需用計數排序落在這個區域中的那些數就可以了。

說明:整數範圍是0 - 2^32 - 1,一共有4g種取值,對映到256m個區段,用乙個64位無符號整數給每個相應區段記數,則每個區段有16(4g/256m = 16)種值,每16個值算一段, 0~15是第1段,16~31是第2段,……2^32-16 ~2^32-1是第256m段。乙個64位無符號整數最大值是0~8g-1,這裡先不考慮溢位的情況。總共占用記憶體256m×8b=2gb。這裡可以用個迴圈來判斷每個數所屬的區域,如:

for(i=0;i++){if(i*16從前到後對每一段的計數累加,當累加的和超過5g時停止,找出這個區段(即累加停止時達到的區段,也是中位數所在的區段)的數值範圍,設為[a,a+15],同時記錄累加到前乙個區段的總數,設為m。然後,釋放除這個區段占用的記憶體。

再讀一遍10g個整數,把在[a,a+15]內的每個值計數,即有16個計數。

對新的計數依次累加,每次的和設為n,當m+n的值超過5g時停止,此時的這個計數所對應的數就是中位數。

3).現在有乙個0-30000的隨機數生成器。請根據這個隨機數生成器,設計乙個**範圍是0-350000彩票中獎號碼列表,其中要包含20000個中獎號碼。

這個題剛好和上面兩個思想相反,乙個0到3萬的隨機數生成器要生成乙個0到35萬的隨機數。那麼我們完全可以將0-35萬的區間分成35/3=12個區間,然後每個區間的長度都小於等於3萬,這樣我們就可以用題目給的隨機數生成器來生成了,然後再加上該區間的基數。那麼要每個區間生成多少個隨機數呢?計算公式就是:區間長度*隨機數密度,在本題目中就是30000*(20000/350000)。最後要注意一點,該題目是有隱含條件的:彩票,這意味著你生成的隨機數裡面不能有重複,這也是我為什麼用雙層桶劃分思想的另外乙個原因。

海量資料處理之雙層桶劃分

什麼是雙層桶 事實上,與其說雙層桶劃分是一種資料結構,不如說它是一種演算法設計思想。面對一堆大量的資料我們無法處理的時候,我們可以將其分成乙個個小的單元,然後根據一定的策略來處理這些小單元,從而達到目的。適用範圍 第k大,中位數,不重複或重複的數字 基本原理及要點 因為元素範圍很大,不能利用直接定址...

海量資料處理問題之雙層桶劃分

雙層桶劃分 什麼是雙層桶 事實上,與其說雙層桶劃分是一種資料結構,不如說它是一種演算法設計思想。面對一堆大量的資料我們無法處理的時候,我們可以將其分成乙個個小的單元,然後根據一定的策略來處理這些小單元,從而達到目的。適用範圍 第k大,中位數,不重複或重複的數字 基本原理及要點 因為元素範圍很大,不能...

海量資料處理專題(六) 雙層桶劃分

什麼是雙層桶 事實上,與其說雙層桶劃分是一種資料結構,不如說它是一種演算法設計思想。面對一堆大量的資料我們無法處理的時候,我們可以將其分成乙個個小的單元,然後根據一定的策略來處理這些小單元,從而達到目的。適用範圍 第k大,中位數,不重複或重複的數字 基本原理及要點 因為元素範圍很大,不能利用直接定址...