用特定的分治策略,選第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大的...