桶排序在海量資料中的應用

2021-08-06 04:56:47 字數 1663 閱讀 4693

題目1:一年的全國高考考生人數為500 萬,分數使用標準分,最低100 ,最高900 ,沒有小數,你把這500 萬元素的陣列排個序。

分析:對500w資料排序,如果基於比較的先進排序,平均比較次數為o(5000000*log5000000)≈1.112億。

方法:建立801(900-100)個桶。將每個考生的分數丟進f(score)=score-100的桶中。這個過程從頭到尾遍歷一遍資料只需要500w次。然後根據桶號大小依次將桶中數值輸出,即可以得到乙個有序的序列。而且可以很容易的得到100分有***人,501分有***人。

實際上,桶排序對資料的條件有特殊要求,如果上面的分數不是從100-900,而是從0-2億,那麼分配2億個桶顯然是不可能的。所以桶排序有其侷限性,適合元素值集合並不大的情況。

題目2:在乙個檔案中有 10g 個整數,亂序排列,要求找出中位數。記憶體限制為 2g。只寫出思路即可(記憶體限制為 2g的意思就是,可以使用2g的空間來執行程式,而不考慮這台機器上的其他軟體的占用記憶體)。

分析: 既然要找中位數,很簡單就是排序的想法。那麼基於位元組的桶排序是乙個可行的方法。

思想:將整型的每1byte作為乙個關鍵字,也就是說乙個整形可以拆成4個keys,而且最高位的keys越大,整數越大。如果高位keys相同,則比較次高位的keys。整個比較過程類似於字串的字典序。

第一步:把10g整數每2g讀入一次記憶體,然後一次遍歷這536,870,912即(1024*1024*1024)*2 /4個資料。每個資料用位運算」>>」取出最高8位(31-24)。這8bits(0-255)最多表示255個桶,那麼可以根據8bit的值來確定丟入第幾個桶。最後把每個桶寫入乙個磁碟檔案中,同時在記憶體中統計每個桶內資料的數量,自然這個數量只需要255個整形空間即可。

代價:(1) 10g資料依次讀入記憶體的io代價(這個是無法避免的,cpu不能直接在磁碟上運算)。(2)在記憶體中遍歷536,870,912個資料,這是乙個o(n)的線性時間複雜度。(3)把255個桶寫會到255個磁碟檔案空間中,這個代價是額外的,也就是多付出一倍的10g資料轉移的時間。

第三步:繼續以記憶體中的整數的次高8bit進行桶排序(23-16)。過程和第一步相同,也是255個桶。

第四步:一直下去,直到最低位元組(7-0bit)的桶排序結束。我相信這個時候完全可以在記憶體中使用一次快排就可以了。

代價:(1)迴圈計算255個桶中的資料量累加,需要o(m)的代價,其中m<255。(2)讀入乙個大概80m左右檔案大小的io代價。

注意,**的情況下,這個需要讀入的第128號檔案仍然大於2g,那麼整個讀入仍然可以按照第一步分批來進行讀取。第二步:根據記憶體中255個桶內的數量,計算中位數在第幾個桶中。很顯然,2,684,354,560個數中位數是第1,342,177,280個。假設前127個桶的資料量相加,發現少於1,342,177,280,把第128個桶資料量加上,大於1,342,177,280。說明,中位數必在磁碟的第128個桶中。而且在這個桶的第1,342,177,280-n(0-127)個數字上。n(0-127)表示前127個桶的資料量之和。然後把第128個檔案中的整數讀入記憶體。(平均而言,每個檔案的大小估計在10g/128=80m左右,當然也不一定,但是超過2g的可能性很小)。

整個過程的時間複雜度在o(n)的線性級別上(沒有任何迴圈巢狀)。但主要時間消耗在第一步的第二次記憶體-磁碟資料交換上,即10g資料分255個檔案寫回磁碟上。一般而言,如果第二步過後,記憶體可以容納下存在中位數的某乙個檔案的話,直接快排就可以了。

桶排序的應用

題目 在乙個無序陣列中,求取有序之後相鄰數差值最大的在乙個無序陣列中,求取有序之後相鄰數差值最大的 要求 時間複雜度為o n 且存在資料範圍特別大 即不允許使用桶排序 解法 只是借鑑了桶的概念,而並沒有使用桶排序來求取。這一次是取決於給定的陣列中的元素個數,過程如下 1 陣列的大小是n,需要準備n ...

令牌桶演算法在限速中的應用

令牌桶中有初始容量,每來乙個請求從桶中獲取乙個令牌,並且在一定時間間隔中可以生成令牌,多餘的令牌被丟棄。可以實現限速功能。主要針對不同使用者的請求進行限速,如果單獨使用google的ratelimiter可以控制請求的速率,如果超過限定的速率則進行等待,但是無法獲取使用者的請求速率。如果下可以根據不...

大資料在高校中的應用

高校大資料及其處理架構 大資料的處理流程與一般資料的處理過程類似,可以定義為在合適工具的輔助下對廣泛異構的資料來源進行抽取和整合,將結果按照一定的標準統一儲存,利用合適的資料分析技術對儲存的資料進行分析從中提取有益的知識,並利用恰當的方式將結果展現給終端使用者。具體來說可以分為資料抽取與整合 資料分...