求海量資料的topK問題

2021-07-22 19:11:36 字數 904 閱讀 7530

問題描述:

取給定list中的前topk個最大的元素並輸出。

關鍵點:

1. topk個最大的元素

2. 我們並不需要順序,因此一切涉及到sort的工作都是不必要的。

3. 要且只要topk個元素,no more needed!!

因此,我們雖然用堆,但並不需要將整個list都建成堆,只需要維護乙個k個元素的堆即可。

其次,我們的堆並不用來排序,這點很重要!!!

具體步驟如下:——求最大的topk個元素

1. 建乙個k個元素的空堆 hp,即乙個k個元素的陣列

2. 遍歷原list,將元素依次壓入hp中,在壓入過程中:

2.1 如果壓入的個數還不到k個,則直接壓入,

2.2 如果壓入之後的個數達到k個,則將該k個元素維護成乙個堆結構

2.3 在壓入每個元素之前,如果hp中已經有k個元素,則將新元素與hp的第乙個元素比較

2.3.1 如果新元素大於hp的第乙個元素,則將新元素放在hp的第乙個位置,並調整hp堆。

2.3.2 如果新元素小於hp的第乙個元素,則continue 到 2.

遍歷完後hp中的k個元素即為list中的前topk大的元素。

package sortnumbers;

public class sortnumbers

if(a[child]= 0;i--)

int tmp = 0;

for(int j = k;j < len;j++ )

} }public static void main(string args) ;

int len = a.length;

myminheapsort(a);

for(i = 0;i < len;i++)

}}

海量資料 TopK問題

在海量資料中找出出現頻率最高的前k個數,或者從海量資料中找出最大的前k個數,這類問題通常被稱為topk問題。下面我們通過乙個簡單的例子來說明 假如面試官給你100w個資料,請找出其最大的前k個數,而且現在只有1m的空間?在32位作業系統中,預設乙個位元組為4個位元組,則有下列運算 needsize ...

海量資料topK問題

給你一億個資料,從中找出前k個大的資料。有兩種解決辦法。1.直接將資料從大到小排序,然後取前k個。但是由於資料的數量過於龐大,要開闢很大的空間,很浪費記憶體,所以這種方法不建議使用。2.用堆來解決。要找前k個大的資料,則將待找的元素的前k個元素建立大小為k的小根堆,小根堆的堆頂元素是這k個資料中最小...

海量資料的TopK問題

乙個基本的是思想是分治法,將1億個資料分成100份,每份100萬個資料,找出每份中最大的100個,最終可以在這100 100個資料中找出最大的100個。我們知道,快排一次的結果是分界點前面的資料比他小,分界點後的比他大,我們可以做如下的討論 如果分界點後面的資料個數大於k個,那麼可以在後面的資料中重...