查詢最小的k個元素

2021-07-07 03:50:17 字數 928 閱讀 7351

題目:輸入n個整數,輸出其中最小的k個。

例如輸入1,2,3,4,5,6,7和這8個數字,則最小的4個數字為1,2,3和4。

分析:這道題最簡單的思路莫過於把輸入的n個整數排序,這樣排在最前面的k個數就是最小的k個數。只是這

種思路的時間複雜度為o(nlogn)。我們試著尋找更快的解決思路。我們可以開闢乙個長度為k的陣列。每次從輸

入的n個整數中讀入乙個數。如果陣列中已經插入的元素少於k個,則將讀入的整數直接放到陣列中。否則長度

為k的陣列已經滿了,不能再往陣列裡插入元素,只能替換了。如果讀入的這個整數比陣列中已有k個整數的最

大值要小,則用讀入的這個整數替換這個最大值;如果讀入的整數比陣列中已有k個整數的最大值還要大,則讀

入的這個整數不可能是最小的k個整數之一,拋棄這個整數。這種思路相當於只要排序k個整數,因此時間複雜

度可以降到o(n+nlogk)。通常情況下k要遠小於n,所以這種方法要優於前面的思路。

從上面的分析,當長度為k的陣列已經滿了之後,如果需要替換,每次替換的都是陣列中的最大值。在常用

的資料結構中,能夠在o(1)時間裡得到最大值的資料結構為最大堆。因此我們可以用堆(heap)來代替陣列。

stl中的set和multiset為我們做了很好的堆實現,我們可以拿過來用。

#include #include #include using namespace std;

typedef multiset> intheap;

/* 在vector裡查詢最小的k個數 */

void findkleastnumbers

( const vector& data, // 輸入的資料

intheap& leastnumbers, // 輸出的k個最小的數

unsigned int k

) }

}}

查詢最小的k個元素

題目 輸入n個整數,輸出其中最小的k個。演算法思想,要是將n個數排序然後輸出前k個,方法很簡單,但計算量比較大,為o nlogn 要是新建乙個有k個元素陣列,在陣列不滿時,將每乙個輸入的資料存入陣列。若陣列滿了,則比較輸入的資料與陣列中最大元素的大小,來決定接下來幹什麼,接下來幹什麼,我語言表達能力...

查詢最小的k個元素

查詢最小的k個元素 題目 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。1 輸入元素,並排序 2 輸出前k個元素 排序 採用高效的排序方法,如 快速排序,歸併排序等 方法一 採用最簡單的方法 include include in...

查詢最小的k個元素

題目 輸入n個整數,輸出其中最小的k個數 例如 1 2 3 4 5 6 7 8 這8個數字,則最小的4個數字為1,2,3,4,第一種 直接對其先排序,再取頭幾個數 這樣最快是nlogn 快排或者堆排 include using namespace std void partsort int a,in...