遞迴與分治之線性時間選擇思路詳解

2021-10-10 20:16:57 字數 959 閱讀 2474

要求:

給定線性序集中n個元素和乙個整數k,1<=k<=n,要求找出n個元素中第k小的元素。

演算法的思路如下:

從a[p:r]中隨機選擇乙個元素將其劃分為三部分

1.a[p:q-1],其中元素都小於等於a[q]

2.a[q],我們設定的劃分基準

3.a[q+1:r],其中的元素都大於等於a[q]

a[p:q]的元素個數為m=q-p+1(例如就有兩個元素,其下標為p和p+1,元素個數2=(p+1)-p+1)

拿我們要找的數字序號k跟m比較:

如果k =m,那麼我們很幸運地找到了,它就是a[q]。

如果k>m,這說明標號為k的元素在大於a[q]的部分,也就是在a[q+1,r]中,我麼要找的元素的編號在這一部分陣列內就變為k-m。

如果k我們遞迴上述過程就能最終找到要找的元素。

在最壞的情況下,演算法需要o(n^2),其平均時間複雜度為o(n)

我們要求在最壞的情況下,演算法的時間複雜度也要達到o(n)

步驟:1.將n個輸入的元素劃分為n/5個組,每個組5個元素,最後乙個組可以不足5個。

2.利用任意一種排序演算法對所有組進行排序,取出每個組的中位數。

3.找出所有組中位數的中位數,並以此為依據進行陣列的劃分。

為什麼要這麼做呢?

因為以中位數的中位數為劃分時,比這個數字大和比這個數字小的元素都至少為3*(n-5)/10個,原因是:

3

*(n/5-

1)*1

/23--

-中位數比x小的每一組中有3個元素比x小n/5

-1---有5個數的組數1/

2---大概有1

/2組的中位數比x小

而當n>=75時,3(n-5)/10≥n/4所以按此基準劃分所得的2個子陣列的長度都至少縮短1/4,也就是說,長度最長為原長度的3/4。

4.劃分完成後對其遞迴上述過程就能得到結果。

演算法設計與分析 遞迴與分治策略 線性時間選擇

問題描述 給定線性序集中n個元素和乙個整數k,1 k n.要求找出這n個元素中第k小的元素,即如果將這個n個元素依其線性序排列時,排在第k個位置的元素就是要找的元素,當k 1時,要找的就是最小的元素 當k n,就是最大的元素 當k n 1 2,稱為中位數。問題分析 在某些特殊的情況下,我們可以實現線...

分治法 線性時間選擇

演算法思想 利用快速排序的方法將a p r 被劃分成兩個子陣列a p i 和a i 1 r 使a p i 中的每個元素都不大於a i 1 r 中每個元素。接著演算法計算子陣列a p i 中元素個數j。如果k j,則第k小的數落在左區間,否則落在右區間,直到k j時,找到第k小的數。對於有重複數字的無...

分治法 線性時間選擇

問題 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k小的元素,演算法的複雜度為o n 思路分析 首先,假如我們要找最大或者最小的元素,那麼只需遍歷一遍序列即可,複雜度為o n 假如要找第k大的元素,k n logn或者k n nlogn時,利用堆排序,時間複雜度仍然可以達到...