利用堆求最大或最小的前k個數

2021-12-29 20:40:48 字數 1100 閱讀 6390

用堆在海量資料中找出最大或最小的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 書裡面講了一種比較好的辦法,...