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

2021-10-09 12:08:36 字數 1780 閱讀 5168

topk問題是經典的演算法問題,其大意是從乙個序列中找出最小(大)的k個數,面對這個問題最簡單的方法當然是先排序後取前k個數,但這樣有些浪費時間,比較經典的方法是借助快排和堆排的思想。

注:為了方便討論,以下均選擇找出最小k個數。

解法1:快速選擇

借助快排是思想,進行區域性的排序。

void

quickselect

(vector<

int>

& input,

int left,

int right,

int k)

int num = input[left]

;int i = left;

int j = right +1;

while

(i <= j)

while

(j >

0&& input[

--j]

> num)

if(i <= j)

}swap

(input[left]

, input[j]);

if(k == j +1)

else

if(k < j +1)

else

}

解法2:借助小頂堆

對數組建堆後執行k次提取最小值操作就行

//下濾

void

percdown

(vector<

int>

& input,

int i,

int n)

}//建堆(小頂堆)

void

heapsort

(vector<

int>

& input)

}//提取最小值

intdeletemin

(vector<

int>

& input)

input[i]

= lastelement;

input.

pop_back()

;return minelement;

}vector<

int>

topk

(vector<

int>

& input,

int k)

return res;

}

解法3:借助大頂堆

維持乙個大小為k的大頂堆,當堆中元素不足k時直接插入元素,當堆中元素個數為k時,遍歷到的元素若小於堆頂元素則替換堆頂元素再下濾,最後堆中的即為topk元素。

//下濾

void

percdown

(vector<

int>

& input,

int i,

int n)

}//建堆(大頂堆)

void

heapsort

(vector<

int>

& input)

}//插入

void

insert

(vector<

int>

& res,

int element)}}

vector<

int>

topk

(vector<

int>

& input,

int k)

else}}

return res;

}

TOP K問題(c 實現)

top k問題 c 實現 給定乙個陣列,找出陣列中最大的k個數或者最小的k個數,稱為top k問題。這是面試的常考題,解法可以是基於最大堆 最大堆排序 基於快速排序實現等等,文字基於快速排序的思想實現。我們不會採用快速排序的演算法來實現top k問題,但我們可以利用快速排序的思想,在陣列中隨機找乙個...

揹包問題的幾種解法及變形

揹包問題 一 01揹包 問題描述 給定n種物品和乙個揹包,物品i的重量是wi,價值是vi,揹包容量為w 對於每個物品,要麼裝揹包,要麼不裝 選擇裝揹包的物品集合,使得物品總重量不超過揹包容量w,且價值和盡量大 限制條件 1 n 100 1 wi,vi 100 1 w 10000 輸入 4 52 3 ...

Top K演算法問題的實現

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