演算法導論學習 之 順序統計量的O n 演算法

2021-06-20 09:13:09 字數 1073 閱讀 3247

順序統計量

定義很簡單:

在乙個由n個元素組成的集合(互異的)中,第i個順序統計量 ,就是這個集合中第i小的元素。

《演算法導論》中給出了乙個期望為線性時間,但最壞情況執行時間為 o(n^2)的 「選擇演算法」,如下:

#include#include#includeint a[1000000] ;

int random_partion(int low , int high) // o(n)

int main ()

書中的」選擇演算法」利用了快速排序中的 "以乙個元素為基準,左邊小、右邊大的有序化處理」 策略,充分地利用了:

partion函式返回的下標i就是第i個順序統計量(第i小的元素)的下標這一重要事實。

然後,

①如果剛好 i == key , 那就已經找到,返回a[i] ,即為所求的順序統計量 ;

②如果 i > key , 則說明:key 在區間 [ 1 , i-1 ] , 繼續遞迴解決這一子問題 ;

③如果 i < key , 則說明:key 在區間 [ i+1 , n ] , 遞迴解決 。

儘管,「選擇演算法」,利用「隨機化分割槽」將執行時間的期望穩定在θ(n),但是最壞情況,仍為o(n^2)。

我突發靈感,想到下面這個改進演算法,應該可以把最壞情況的時間複雜度降至o(n) 。

其原理, 是受hoare版本的快速排序的啟發,通過:

「兩頭夾逼,左邊是小於等於第key個順序統計量的區域,右邊是大於第key個順序統計量的區域,不服從的數對交換」的操作,遍歷了一遍陣列即完成任務。

**如下:

#include#includeint a[100000] ;

using namespace std ;

int find(int low , int high , int key) // o(n)

while(i

演算法導論(4) 順序統計量

1.最大值與最小值 將一對輸入元素相互進行比較,然後把較小的與當前的最小值比較,把較大的與當前最大值比較,這樣每兩個元素比較3次,最多需要3 n 2次比較可以同時找到一組輸入元素中的最大值與最小值。2.順序統計量 乙個n個元素組成的集合中,第i個順序統計量是該集合中第i小的元素。中位數是i n 1 ...

排序和順序統計量(演算法導論)

人一生別太狂,指不定誰輝煌 總結排序演算法的執行時間 演算法最壞執行時間 平均期望執行時間 是否是原址排序 插入排序o n2 o n2 是 歸併排序o nlgn o nlgn 否 堆排序o n lgn 是快速排序o n2 o nlgn 期望 是 計數排序o k n o k n 否基數排序o d k ...

演算法導論 中位數與順序統計量

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 7 7 一 選擇最大值或者最小值的最優演算法 對於長度為n的陣列,已證找最大值或者最小值比較操作下界就是n 1。所以只需要讓第乙個值為初始最大值或者初始最小值,用所有的值與這個值比較,更新這個值即可。def minimum a minnu...