用堆在海量資料中找出最大或最小的k個數,效率非常高。
1、在一組資料中找出最小的k個數
解題思路:
要找出最小的k個數,我們可以先用這組資料中的k個數構建一棵「最大堆」,然後再將剩下的元素與堆頂元素相比。如果大於堆頂元素,則不做處理,繼續向下比較。如果小於堆頂元素,則將堆頂元素與這個元素交換,然後再恢復堆序,繼續向下比較。這樣的話最後這個堆裡面儲存的就是最小的k個數。
例:在裡面找出最小的4個數
1、用前四個數構造一顆最大堆
(2、用剩下的數與堆頂元素進行比較,如圖:
2、在一組堆中找出最大的前k個數
與找最小的數是相同的道理,不過找最大的數時要建立乙個k個數的最小堆。
時間複雜度分析:
建立乙個k個數的堆:o(k*lgk)
向後比較:o((n-k)*lgk)
時間複雜度為:o(n*lgk)
//**
#pragma once
#include
#include
using namespace std;
template
struct smallnum //求最小的數,建最大堆
};template
struct greatnum //求最大的數,建最小堆
};template> //預設求最小的k個數
class heapsearch
heapsearch(t* a, int size,int k)
for (int i = (k - 2) / 2; i >= 0; --i)
findknum(a,size,k);
}void display()
cout << endl;
}protected:
void adjustdown(int root,int k)
;
利用K 堆求最大的K個數
1.原理 1.1將資料存在陣列中,利用堆排排序陣列的前k個數 遞增 此時建立的是小堆,陣列的第乙個元素儲存堆中最小值。1.2從 k 1 個陣列元素遍歷到最後,每次都和堆頂元素對比,如果大於堆頂元素,交換兩者,調整堆。1.3輸出陣列前k個數,就是最大的k個數。include define k 3 vo...
求最小的K個數
方法一 利用快排的思想,複雜度為o n class solution input low pivot return low vector getleastnumbers solution vector input,int k else vector res input.begin input.beg...
找出最大的前K個數
是程式設計之美裡的乙個問題,找出乙個列表中的最大的前k個數,最先想到,也是最簡單的思路是做乙個k長度的盒子,然後乙個乙個資料往裡放,有大的來了就把小的剔除掉。但是這樣的做法會導致盒子內部要是有序的。不然找不出誰是最小的,比較和剔除就不能做了 這個做法的複雜度是o n k 書裡面講了一種比較好的辦法,...