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

2021-10-04 19:41:09 字數 1255 閱讀 6433

用特定的分治策略,選第k小的元素。

設 l是n個元素的集合,從 l 中選取第k小的元素,其中 1<=k<=n.這裡的第k小元素是指,當 l 按從小到大排好序之後,排在第k個位置的元素。

●k=|s1|+1, m』 就是所要找的第k小的數(以m』為劃分標準後, 比m』小的有|s1|個,如果恰巧k=|s1|+1, 則m』就是所要找的第k小的數)

●k<=|s1|,歸約為在s1,中找第k1小的子問題,k1在子問題中相對位置不變,即k1=k ;

●k>|s1|+1,歸約為在s,中找k2位置的子問題,k2 相對於s2子問題和k相對於s的關係,即k2= k-|s1|-1。(在s中找k,就是在s2中找k2)

select

(s,k)

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

輸出: s中的第k小元素

1、將s劃分成5個一組,共「n/

5」個組

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

3、m*←select

(m,[

|m|/2]

)//選m的中位數m* ,將s中的數劃分成a,b,c,d四個集合

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

5、s1←s1uc; s2←s2∪b;

6、if k=

|s1|

+l then 輸出m*

7、else

if k≤|s1|

8、 then select

(s1, k)

9、else

select

(s2, k-

|s1l-

1)

假設n是5的倍數,且 n/5 是奇數,即n/5=2r+1,於是 |a|=|d|=2r ,|b|=|c|=3r+2, n=10r+5,

如果a和d的,元素都小於 m*,那麼它們的元素都加入 s1,且下一步演算法又在這個大的子問題上進行遞迴呼叫,這對應了歸約後子問題規模的上界,演算法複雜度的最壞情況。

子問題規模為:

表明子問題規模不超過原問題規模的 7/10,

其中,w(n/5)為查詢 m的時間,總規模n中選出n/5個數來找中位數tn是構造中位數集合,以及a& d和m進行比較的時間開銷,t是某個常數

分治演算法求第k小元素

1.問題 用分治的演算法求乙個陣列s n 中第k小的元素。2.解析 採取和快速演算法相同的思路,但是結合分治的思想,選取恰當的基準值。找到基準值以後,再按照快速排序的方法進行查詢就好了。3.設計 int r 5int r group ceil high low 1 1.0 r ceil取上限,總共分...

分治演算法四(查詢第K小元素)

1.問題描述 對於乙個非有序的陣列a start.end 求陣列中第k小的元素 2.解決思路 最直觀的的方式,先對陣列排序,複雜度為o nlgn 但是這樣複雜度太大,可以利用快速排序的思路,解決這個問題,並且複雜度為o n 關鍵在於劃分只乙個部分,我們知道快速排序選擇乙個pivot對陣列進行劃分,左...

分治演算法求陣列第k小元素

在 陣列s中查詢第k小的元素並輸出 分治演算法 將s分為多個組q,每組5個元素,有剩餘的話,則排序剩餘元素。將q個組單獨排序,每組找出中項,中項組成集合m,以m中項n作為標準,將s劃分為兩個子陣列s1和s2,把這個陣列中比n小的都放入s1的陣列中,陣列s1的元素個數是 s1 個 把這個陣列中比n大的...