海量資料找到最大的100個資料

2021-09-12 03:42:14 字數 1144 閱讀 2202

海量資料指的是資料量非常大,億級的資料。如果是 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 順序讀取後續元素,直到結束。每次讀取乙個元素,如果該元素比堆頂元素小,直接丟棄。如果大於堆頂元素,則用該元素替換堆頂...