在海量資料中找到最大的前K個數(top K問題)

2021-09-12 21:49:08 字數 694 閱讀 6103

問題分析:資料是海量的,可能達到10億或者100億以上,只需要找最大的前100個數。所以將資料一次性排序然後取前100個是不太可取的操作。做了很多無用功,並且記憶體一次性也載入不了海量資料。

解決方案:

方案一:堆。一般說在很多資料中取前多少個資料,我們都會想到,這裡我們使用堆來解決問題。首先取k個數建立乙個小根堆(堆頂是堆中最小的元素),建堆的時間複雜度是o(klgk),這個時間複雜度雖然是上界,但不是漸進緊確的,漸進緊確的上界為o(k),具體推導見《演算法導論.第三版》p88。接著依次從海量資料(n個數)中拿出乙個資料與堆頂元素進行比較,若小於堆頂元素則繼續從海量資料中取下乙個數,若取出的數比堆頂元素大,則替換堆頂元素,並維護堆的性質,維護堆的性質所需要的時間複雜度是o(lgk)。直到將(n-m)個數遍歷完,堆中剩餘的數就是n個數的最大前k個數。 故總時間複雜度為o(k+(n-m)lgk) => o(n·lgk)   【n為海量資料,k為要取的最大前k個數。】

方案二:分塊。面對大量資料時,分塊也是比較容易想到的解決方法。假設將海量資料分成1000塊,然後在每塊中找到最大的前k個數。然後再從1000·k個數中直到最大的前k個數。

如何從前N個資料中找到前K個大 小的資料並列印?

要解決這個問題,那麼我們可以從前十個資料入手,先拿到前十個資料,接下來我們以求前2000個資料中前十個小的資料為例 取出前十個資料,我們把它放入小跟堆裡 從十乙個資料vec i 開始,我們與第一小minheap.top 資料作比較。如果vec i minheap.top 則將vec i 的值賦給mi...

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

海量資料指的是資料量非常大,億級的資料。如果是 int 型資料,int型陣列佔4個位元組的記憶體,1億個int型資料就得占用近400m的記憶體,計算機效能差的話很難一次性讀入然後排序。所以一般的靠排序來做這道題是很尷尬的。這裡用最小堆來解決,上篇講了大頂堆的原理及大頂堆的排序,這裡由於是找最大的10...

最小的k個數(最大堆,海量資料)

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 維護乙個大小為k的最大堆,先初始化前k個數,然後滑動視窗,如果比堆頂大,直接拋棄,比堆頂小交換再調整堆。coding utf 8 class solution def get...