乙個檔案中有9億條不重複的9位整數,對這個檔案中數字進行排序;
針對這個問題,最容易想到的方法是將所有資料匯入到記憶體中,然後使用常規的排序方法,例如插入排序,快速排序,歸併排序等各種排序方法對資料進行排序,最後將排序好的資料存入檔案.但這些方法在此並不適用,由於資料量巨大,對32位機器而言,很難將這麼多資料一次載入到記憶體,更不用說進行排序了.所以此種方法一般不可行,需要考慮其他方法.
方法一.資料庫排序法,將文字檔案匯入到資料庫中,讓文字檔案匯入到資料庫中,讓資料庫進行索引排序操作後提取資料到檔案.該種方法雖然操作簡單,方便,但是運算速度較慢,而且對資料庫裝置要求比較高.
方法二,分治法.通過hash法將9億條資料分為20段,每一段大約5000萬條,大約需要占用500萬*4b = 200mb空間,在檔案中依次搜尋0~5000萬,50000001~1億 ,,,,,,,將排序的結果存入檔案,該方法要裝滿9位整數,一共需要20次,所以一共要進行20次排序,需要對檔案進行20次讀操作.該方法雖然縮小了每次使用的記憶體空間大小,但是編碼複雜,速度也慢.
方法三.位圖法.考慮到最大的9位整數為999999999,由於9億條資料是不重複的,可以把這些資料組成乙個佇列或者陣列,讓它有0~999999999(一共10億個數)元素陣列下標表示數值,結點中用0表示沒有這個數,1表示存在這個數,判斷0或1只用乙個bit儲存就夠了,而宣告乙個可以包含9位整數的bit陣列,一共需要10億/8,大約120mb記憶體,把記憶體中的陣列全部初始化為0,讀取檔案中的資料,並將資料放入記憶體.比如讀到乙個資料為314332897這個資料,那就先在記憶體中找到314332897這個bit,並將bit值置為1,遍歷整個bit陣列,將bit為1的陣列下標存入檔案,最終得到排序的內容.
此類排序問題的求解方法一般都是採用上述方法。
海量資料處理之排序問題
海量資料處理中一類常見的問題就是排序問題,即對海量資料中的資料進行排序,例如,乙個檔案中有9億條不重複的9位整數,對這個檔案中數字進行排序。針對這個問題,最容易想到的方法是將所有資料匯入到記憶體中,然後使用常規的排序方法,例如插入排序 快速排序 歸併排序等各種排序方法對資料進行排序,最後將排序好的資...
海量資料處理 (top K問題)
前兩天面試3面學長問我的這個問題 想說teg的3個面試學長都是好和藹,希望能完成最後一面,各方面原因造成我無比想去鵝場的心已經按捺不住了 這個問題還是建立最小堆比較好一些。先拿10000個數建堆,然後一次新增剩餘元素,如果大於堆頂的數 10000中最小的 將這個數替換堆頂,並調整結構使之仍然是乙個最...
海量資料處理問題
一 給乙個超過100g大小的log file,log中存著ip位址,設計演算法找到出現次數最多的ip位址?該題目要求的是出現次數最多的乙個,有時候題目也會變成求出現次數排名前k的ip位址,兩個問題的解題思路是一致的,只是求前k個會多乙個小步驟,就是建堆,所以現在學習一下,求前k個的思路。100g記憶...