TOP K問題(c 實現)

2021-09-25 15:25:37 字數 1189 閱讀 7655

@top-k問題(c++實現)

給定乙個陣列,找出陣列中最大的k個數或者最小的k個數,稱為top k問題。這是面試的常考題,解法可以是基於最大堆/最大堆排序、基於快速排序實現等等,文字基於快速排序的思想實現。

我們不會採用快速排序的演算法來實現top-k問題,但我們可以利用快速排序的思想,在陣列中隨機找乙個元素pivot,將陣列分成兩部分sa和sb,其中sa的元素》=pivot,sb的元素若sa中元素的個數大於或等於k,則在sa中查詢最大的k個數

若sa中元素的個數小於k,其個數為len,則在sb中查詢k-len個數字

如此遞迴下去,不斷把問題分解為更小的問題,直到求出結果。注意,這裡遞迴的原子就是在[a,b]中查詢n個數字

該演算法的平均時間複雜度為o(n * logk)。以求k大的數為例,演算法實現如下:

#include 

#include

using namespace std;

//這個和快速排序中的partion是相同的

int partion

(vector

&a,int left,int right)

}swap

(a[i]

,a[right-1]

);return i+1;

}int topk

(vector

&a,int left, int right, int k)

else

}return index;

}int main()

; vector

a(b,b+5)

; int l = a.

size()

; int k =4;

cout <<

"原陣列為:"

;for

(int i=

0;i) cout << endl;

int inde =

topk

(a,1

,l,k)

; cout <<

"top-k 為:"

Top K演算法問題的實現

前奏 中,後來為了論證類似快速排序中partition的方法在最壞情況下,能在o n 的時間複雜度內找到最小的k個數,而前前後後updated了10餘次。所謂功夫不負苦心人,終於得到了乙個想要的結果。簡單總結如下 詳情,請參考原文第三章 1 randomized select,以序列中隨機選取乙個元...

topK問題分析與實現

一組資料中,需要找出前k大 小 的資料 如果是完全有序,那麼輸出所求資料很簡答了 需要排序,將資料完全排序 使用快排思想,不斷分片,左側是比基準小的元素,右側是比基準大的元素,令 index 基準元素下標 a,index右側,在index右側尋找新的基數,直到基數的下標index k b,index...

topK問題的幾種解法及C 實現

topk問題是經典的演算法問題,其大意是從乙個序列中找出最小 大 的k個數,面對這個問題最簡單的方法當然是先排序後取前k個數,但這樣有些浪費時間,比較經典的方法是借助快排和堆排的思想。注 為了方便討論,以下均選擇找出最小k個數。解法1 快速選擇 借助快排是思想,進行區域性的排序。void quick...