@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...