Q6 特定分治策略

2021-10-04 19:53:33 字數 1301 閱讀 8950

「6.5.7選第k小元素:特定分治策略」

在給出的乙個陣列s中,找到第k小的數。

以s中的某個元素m作為劃分標準,將s劃分為兩個子陣列s1和s2,把這個陣列中比m小的都放入s1的陣列中,陣列s1的元素個數是|s1|個;把這個陣列中比m*大的都放入s2的陣列中,陣列s2的元素個數是|s2|個。

若k若k=|s1|+1,則m*就是要找的第k小元素。

若k>|s1|+1,則原問題歸納為在陣列s2中找第n−|s1|−1小的子問題。

輸入: n個數的陣列s,正整數k

輸出: s中的第k小元素

1.將s劃分成5個一組,共「n/5」個組。

2.每組找乙個中位數,把這些中位數放到集合m中

3. m←select(m,「|m|/27」 //選m的中位數m,將s中的數劃分成a,b,c,d四個集合

4.把a和d中的每個元素與m比較,小的構成s1,大的構成s2 ;

5. s1←s1∪c;s2←s2∪b

6. if k=|s1|+1 then 輸出m

7. else if k≤|s1 |

8.then select(s1, k)

9.else select(s2, k-|s1|-1)

int

select

(int

*a,int len,

int k)

for(

int i =

0; i < cnt; i++

)int m_s =

select

(m, num, num /2+

1);for

(int i =

0; i < cnt; i++

)else

if(a[

5* i +2]

== m_s)

else

}for

(int i =

5* cnt; i < len; i++)if

(k == num_s1 +1)

return m_s;

else

if(k <= num_s1)

return

select

(s1, num_s1, k)

;else

return

select

(s2, num_s2, k - num_s1 -1)

;}

時間複雜度是o(n)

選擇問題之特定分治策略

設 l 是 n 個元素的集合,從 l 中選取第 k 小的元素,其中 1 k n.這裡 的第 k 小元素是指,當 l 按從小到大排好序之後,排在第 k 個位置的元素。解決該問題用到的是分治思想。下面引用老師的分析 演算法思想 int select int a,int left,int right,in...

Q6 旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。最簡單的方法是遍歷陣列得到最小的元素,演算法複雜度是o n 但是沒有利用...

演算法實驗6 選第k小元素 特定分治策略

用特定的分治策略,選第k小的元素。設 l是n個元素的集合,從 l 中選取第k小的元素,其中 1 k n.這裡的第k小元素是指,當 l 按從小到大排好序之後,排在第k個位置的元素。k s1 1,m 就是所要找的第k小的數 以m 為劃分標準後,比m 小的有 s1 個,如果恰巧k s1 1,則m 就是所要...