海量資料指的是資料量非常大,億級的資料。如果是 int 型資料,int型陣列佔4個位元組的記憶體,1億個int型資料就得占用近400m的記憶體,計算機效能差的話很難一次性讀入然後排序。所以一般的靠排序來做這道題是很尷尬的。
這裡用最小堆來解決,上篇講了大頂堆的原理及大頂堆的排序,這裡由於是找最大的100條資料,所以要用到小頂堆。
1.堆頂的元素最小
2. 左右子節點的值都大於父節點的值。
1.用1億條資料的前100個資料建立乙個小頂堆,然後從第101條資料遍歷到最後的1億條,如果數值大於堆頂的資料,則替換堆頂的資料然後從新建立小頂堆;
實現**如下:
public class heapsort
system.out.println(".............建小根堆...............");
for (int j = 0; j < a.length; j++)
}private void minheapify(int a, int i, int heapsize)
}/** * 找到陣列最大的n個數:先是建乙個n個數的小根堆,然後遍歷從n到陣列的大小,如果遍歷的值大於堆頂的元素則替換堆頂的值,然後從堆頂開始調整最小堆
** @param arr
* @param n
*/public void findklargestvalue(int arr, int n)
system.out.println(arrays.tostring(arr));
buildminheap(tmp);
int tp = 0;
for (int j = n; j < arr.length; j++)
minheapify(tmp, 0, tmp.length);
}system.out.println(arrays.tostring(tmp));
}}
測試**:
heapsort heapsort = new heapsort();
int b = ;
heapsort.findklargestvalue(b, 10);
如果不了解小頂堆的可以看我的這篇文章:
大頂堆的原及即實現
100萬個數中找到最大的100個數
1.演算法如下 根據快速排序劃分的思想 1 遞迴對所有資料分成 a,b b b,d 兩個區間,b,d 區間內的數都是大於 a,b 區間內的數 2 對 b,d 重複 1 操作,直到最右邊的區間個數小於100個。注意 a,b 區間不用劃分 3 返回上乙個區間,並返回此區間的數字數目。接著方法仍然是對上一...
在海量資料中找到最大的前K個數(top K問題)
問題分析 資料是海量的,可能達到10億或者100億以上,只需要找最大的前100個數。所以將資料一次性排序然後取前100個是不太可取的操作。做了很多無用功,並且記憶體一次性也載入不了海量資料。解決方案 方案一 堆。一般說在很多資料中取前多少個資料,我們都會想到堆,這裡我們使用堆來解決問題。首先取k個數...
10億資料中取最大的100個資料
思路1 利用堆排序實現 1 取前m個元素 例如m 100 建立乙個小頂堆。保持乙個小頂堆得性質的步驟,執行時間為o lgm 建立乙個小頂堆執行時間為m o lgm o m lgm 2 順序讀取後續元素,直到結束。每次讀取乙個元素,如果該元素比堆頂元素小,直接丟棄。如果大於堆頂元素,則用該元素替換堆頂...