給你一億個資料,從中找出前k個大的資料。
有兩種解決辦法。
1.直接將資料從大到小排序,然後取前k個。但是由於資料的數量過於龐大,要開闢很大的空間,很浪費記憶體,所以這種方法不建議使用。
2.用堆來解決。要找前k個大的資料,則將待找的元素的前k個元素建立大小為k的小根堆,小根堆的堆頂元素是這k個資料中最小的。從剩下的資料裡取乙個元素每次和堆頂元素比較,如果陣列當中的當前元素大於堆頂元素,則將堆頂元素出堆,然後將當前元素入堆。再將其調整為小堆,如此再迴圈。
**如下:
public
static integer[
]findknum
(int
array,
int k)})
;//2.
for(
int i=
0; i)else}}
integer[
] integers =
newinteger
[k];
for(
int i=
0; i)return integers;
}
海量資料 TopK問題
在海量資料中找出出現頻率最高的前k個數,或者從海量資料中找出最大的前k個數,這類問題通常被稱為topk問題。下面我們通過乙個簡單的例子來說明 假如面試官給你100w個資料,請找出其最大的前k個數,而且現在只有1m的空間?在32位作業系統中,預設乙個位元組為4個位元組,則有下列運算 needsize ...
海量資料的TopK問題
乙個基本的是思想是分治法,將1億個資料分成100份,每份100萬個資料,找出每份中最大的100個,最終可以在這100 100個資料中找出最大的100個。我們知道,快排一次的結果是分界點前面的資料比他小,分界點後的比他大,我們可以做如下的討論 如果分界點後面的資料個數大於k個,那麼可以在後面的資料中重...
求海量資料的topK問題
問題描述 取給定list中的前topk個最大的元素並輸出。關鍵點 1.topk個最大的元素 2.我們並不需要順序,因此一切涉及到sort的工作都是不必要的。3.要且只要topk個元素,no more needed!因此,我們雖然用堆,但並不需要將整個list都建成堆,只需要維護乙個k個元素的堆即可。...