分治演算法在一般選擇問題中的應用

2021-07-26 09:00:31 字數 1097 閱讀 8111

下面有乙個要求就是在乙個陣列中選取第i小的元素,怎麼辦?直接排序?然後再輸出結果?當然這是一種解決方法,但是效率很低,演算法導論中給出了乙個比較經典的解決方法:

其過程與快速排序過程中劃分類似。每次劃分集合可以確定乙個元素的最終位置,根據這個位置可以判斷是否是我們要求的第i小的元素。如果不是,那麼我們只關心劃分產出兩個子部分中的其中乙個,根據i的值來判斷是前乙個還是後乙個,然後接著對子陣列進行劃分,重複此過程,直到找到第i個小的元素。劃分可以採用隨機劃分,這樣能夠保證期望時間是θ(n)(假設所有元素是不同的),簡言之就是這個演算法參考了快排中的一些思路,因為每一次快排之後主元的位置都是已知的,並且主元左邊的數都要比他小,右邊的數都要比他大,然後我們可以知道主元在陣列中是第幾大,如果主元大了,那麼在左邊的子串行中繼續上邊的步驟,右邊的直接丟棄,反之亦然。

舉個栗子:

ex:現有集合a=,要求其第5小的元素,假設在劃分過程中以總是以最後乙個元素為主元素進行劃分。執行過程如下圖所示:

int p=random_partion(a,begin,end);//以最後乙個元素進行劃分,p是最後乙個元素在序列中的位置

int k=p-begin+1;

if(j==k)

else if(j

簡介Linux的一般應用

簡介linux的一般應用 linux 目前的一般應用主要有以下幾方面 桌面型計算機 所謂的桌面型計算機就是一般使用者在螢幕前面工作時候的常見的作業系統了!我們稱之為 desktop 系統,就是簡稱的桌面型計算機了!說到桌面型計算機就不能不提一下 x window system o 由前一章提到的 u...

關鍵路徑在演算法題中的應用

1 aov和aoe網 aov是指的用頂點 vertex 表示活動,用邊集表示活動間優先順序的有向圖,圖中不會有環。aoe是指用帶權的邊集 edge 表示活動,用頂點表示事件的有向圖,邊權表示 完成活動所需要的時間。aoe網表示乙個工程的進行過程,它也不應該有環,一般來說它只有乙個源點 入度為零 和乙...

一般Fibonacci演算法的優化

一般的fibonacci演算法 int fibonacci int number 該演算法的時間複雜度達到了驚人的指數級別,效率慢的不行,下面提供兩種不同的改進方式,時間複雜度分別為o n 和o logn 方法一 o n int fibonacci int number int result 0 f...