大資料排序的幾種方法

2021-07-24 13:26:28 字數 2326 閱讀 4899

在秋招的筆試中遇到過好幾次大資料量排序的問題,今天又在程式設計珠璣上看到了類似的問題,通過以前的一些積累,寫幾點我對大資料排序的幾種方法的一些見解。

位圖法是我在程式設計珠璣上看到的一種比較新穎的方法,思路比較巧妙效率也很高。

使用場景舉例:對2g的資料量進行排序,這是基本要求。

資料:1、每個資料不大於8億;2、資料型別位int;3、每個資料最多重複一次。

記憶體:最多用200m的記憶體進行操作。

首先對占用的記憶體進行判斷,每個資料不大於8億,那麼8億是乙個什麼概念呢。

**1 byte = 8 bit(位)

1024 byte = 8*1024 bit = 1k

1024 k = 8*1024*1024 bit = 1m = 8388608 bit**

也就是1m=8388608位

而位圖法的基本思想就是利用一位代表乙個數字,例如3位上為1,則說明3在資料中出現過,若為0,則說明3在資料中沒有出現過。所以當題目中出現每個資料最多重複一次這個條件時,我們可以考慮使用位圖法來進行大資料排序。

那麼假如使用位圖法來進行這題的排序,記憶體占用多少呢。由題目知道每個資料不大於8億,那麼我們就需要8億位,占用800000000/8388608=95m的空間,滿足最多使用200m記憶體進行操作的條件,這也是這題能夠使用位圖法來解決的乙個基礎。

堆排序是4種平均時間複雜度為nlogn的排序方法之一,其優點在於當求m個數中的前n個最大數,和最小數的時候效能極好。所以當從海量資料中要找出前m個最大值或最小值,而對其他值沒有要求時,使用堆排序法效果很好。

使用場景:從1億個整數裡找出100個最大的數

步驟:

1.讀取前100個數字,建立最大值堆。(這裡採用堆排序將空間複雜度講得很低,要排序1億個數,但一次性只需讀取100個數字,或者設定其他基數,不需要1次性讀完所有資料,降低對記憶體要求)

2、依次讀取餘下的數,與最大值堆作比較,維持最大值堆。可以每次讀取的數量為乙個磁碟頁面,將每個頁面的資料依次進堆比較,這樣節省io時間。

3.將堆進行排序,即可得到100個有序最大值。

堆排序是一種常見的演算法,但了解其的使用場景能夠幫助我們更好的理解它。

「` public abstract class heapsort

public boolean heapsort(listlist, int n)

if(!heapcreate(list, n))

for(int i = n; i > 0; --i)

return true;

} public boolean heapcreate(listlist, int length)

for(int i = (length / 2 - 1); i >= 0; --i)

} return true;

} public boolean heapadjust(listlist, int middle, int length)

e temp = list.get(middle);

for(int i = (2 * middle + 1); i < length; i *= 2)

if(this.compare(temp,list.get(i)))

list.set(middle, list.get(i));

middle = i;

} list.set(middle, temp);

return true;

} public void swap(listlist, int i, int j)}

「分治策略師對常見複雜問題的一種萬能的解決方法,雖然很多情況下,分治策略的解法都不是最優解,但是其通用性很強。

分治法的核心就是將乙個複雜的問題通過分解抽象成若干個簡單的問題。

應用場景:10g的資料,在2g記憶體的單台機器上排序的演算法

我的想法,這個場景既沒有介紹資料是否有重複,也沒有給出資料的範圍,也不是求最大的個數。而通過分治雖然可能需要的io次數很多,但是對解決這個問題還是具有一定的可行性的。

步驟:

1、從大資料中抽取樣本,將需要排序的資料切分為多個樣本數大致相等的區間,例如:1-100,101-300…

2、將大資料檔案切分為多個小資料檔案,這裡要考慮io次數和硬體資源問題,例如可將小資料檔案數設定為1g(要預留記憶體給執行時的程式使用)

3、使用最優的演算法對小資料檔案的資料進行排序,將排序結果按照步驟1劃分的區間進行儲存

4、對各個資料區間內的排序結果檔案進行處理,最終每個區間得到乙個排序結果的檔案

5、將各個區間的排序結果合併.

通過分治將大資料變成小資料進行處理,再合併。

排序的幾種方法

三種排序 選擇排序,氣泡排序,插入排序 的總結 1.選擇排序 1 public class demo3 遍歷排序前的數值 for int i 0 i num.length 1 i 如果最小值的標號未改變,代表本身已是最小值,否則交換數值 if min i 遍歷排序後的數值 for int i 0 i...

排序的幾種方法

三種排序 選擇排序,氣泡排序,插入排序 的總結 1.選擇排序 1 public class demo3 遍歷排序前的數值 for int i 0 i num.length 1 i 如果最小值的標號未改變,代表本身已是最小值,否則交換數值 if min i 遍歷排序後的數值 for int i 0 i...

排序的幾種方法回顧

氣泡排序 氣泡排序 是一種交換排序。兩兩比較待排序元素,發現2個元素次序相反則進行交換,直到沒有反序的元素為止。氣泡排序 通過無序區中相鄰記錄的關鍵字間的比較和位置的交換,使關鍵字最小的元素如氣泡似的逐步上浮直水面。有序區逐漸擴大,無序區逐漸縮小。lists 1,9,3,5,2,0,8,7,6,4 ...