問題描述:
取給定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個,那麼可以在後面的資料中重...