選擇問題之特定分治策略

2021-10-04 19:30:45 字數 793 閱讀 8063

設 l 是 n 個元素的集合,從 l 中選取第 k 小的元素,其中 1<=k<=n.這裡

的第 k 小元素是指,當 l 按從小到大排好序之後,排在第 k 個位置的元素。

解決該問題用到的是分治思想

下面引用老師的分析

演算法思想

int

select

(int a,

int left,

int right,

int k)

int q = p /5;

//分為q組

int* m = new int

[q];

for(遍歷分組)

//對中位數陣列進行排序得到mid

for(遍歷陣列)

if(若小於mid的數超過k個)

return

select

(a1,

0, count1, k);if

(若小於mid的數加上等於mid的數超過k個)

return mid;

//其餘情況

return

select

(a3,

0, count3, k - count1 - count2)

;}

下面引用老師的分析

所以最後推導出演算法時間複雜度為o(n)

Q6 特定分治策略

6.5.7選第k小元素 特定分治策略 在給出的乙個陣列s中,找到第k小的數。以s中的某個元素m作為劃分標準,將s劃分為兩個子陣列s1和s2,把這個陣列中比m小的都放入s1的陣列中,陣列s1的元素個數是 s1 個 把這個陣列中比m 大的都放入s2的陣列中,陣列s2的元素個數是 s2 個。若k若k s1...

分治策略之棋盤覆蓋問題

1 引出 首先用合併排序來引出我們今天的主角,合併排序即使用了分治的策略,它將所要排序的區間劃分為2個子區間,將這兩個子區間分別進行遞迴排好順序,然後合併這兩個子區間 合併過程運用了簡單的雙指標演算法 即獲得原問題的解。其實棋盤覆蓋問題也是這樣的。2 主角登場 問題 在乙個2k 2k個方格組成的棋盤...

分治策略之合併排序問題

基本思想 將待排序元素分成大小大致相同的2個子集合,分別對2個子集合進行排序,最終將排好序的子集合合併成為所要求的排好序的合。例如 演算法 mergesort的遞迴過程可以消去。合併排序 遞迴 include using namespace std template void copy type a...