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,以序列中隨機選取乙個元...