雙層桶

雙層桶

雙層桶不是數據結構,只是一種算法思維,分治是其根本思想。在處理海量數據時,有着一席之地。

當我們有一大堆數據需要處理,而侷限於各種資源限制(內存、範圍等)又不能一次處理完畢,此時,我們就需要將這一大堆數據分成我們可以處理的多個小段數據。然後,按照一定的策略處理各小段數據,從而完成既定目標。

雙層桶並不是要求我們只能把我們的大數據劃分一次,雙層是個虛指,如果有需要,可以把數據一層一層的進行分割,一層一層的處理,直至可以完成目標。

 

適用範圍

第K大

中位數

不反覆或反覆的數字

 ......

 

實例

1).2.5億個整數中找出不重複的整數的個數,內存空間不足以包容這2.5億個整數。

整數個數爲2^32,也就是,我們可以將這2^32個數劃分爲2^8個區域,然後不同的區域在使用bitmap等方式處理了。也可以直接用bitmap處理,每兩個bit位表示一個整數,00表示整數未出現,01表示出現一次,10表示出現兩次及其以上。

 

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

我們將int分別爲2^16個地區,然後讀取數據統計落到各個地區裏的數的個數,以後我們憑據統計成果就能夠判定中位數落到哪個區域,同時曉得這個區域中的第幾大數恰好是中位數。然後第二次掃描我們只統計落在這個區域中的那些數便可以了。

 

3).此刻有一個0-30000的隨機數生成器。請憑據這個隨機數生成器,計劃一個抽獎範圍是0-350000彩票中獎號碼列表,箇中要包括20000其中獎號碼。

一個0到3萬的隨機數生成器要生成一個0到35萬的隨機數。那麼我們完整可以將0-35萬的區間分成35/3=12個區間,然後每一個區間的長度都小於3萬,我們就可以用問題給的隨機數生成器來生成爲了,然後再加之該區間的基數。每一個區間要生成的隨機數個數:區間長度*隨機數密度,30000*(20000/350000)。

 

發佈了77 篇原創文章 · 獲贊 13 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章