1. 程式人生 > >演算法導論 學習筆記 第九章 中值和順序統計

演算法導論 學習筆記 第九章 中值和順序統計

本章其實只講了一個問題,那就是如何從一個數組當中用線性時間內找出第i個小的元素。

最小值和最大值

這個就比較簡單了,直接挨個比,執行時間就是線性的,而且這就是最好的辦法。
如何同時找出最小值和最大值咧?
這個其實也簡單,那就記錄兩個資料唄。執行時間是找單個的兩倍。
但是這個就不是最好的辦法了。有一個比這個更好的方法。上面的辦法是每一個元素需要比較兩次,
而下面的方法是每兩個元素需要比較三次。比上一個好一點
那就是我們不去一個一個比較,而是一對一對的比較,然後把小的跟最小值比較,大的跟最大值比較。厲害吧。

期望線性時間內的選擇問題(這個翻譯總感覺不通順)平均情況嘛

Θ(n2)

就是我們平時的選擇,不可能總是要求我們找出最小值和最大值。但是儘管不是找出最小值和最大值,平均情況下我們依然可以線上性時間內完成。

用的核心思想是分治法。最壞的情況下執行時間是
Θ(n2)

上虛擬碼

RANDOMIZED-SELECT(A,p,r,i)

if p = r
    then return A[p]
q ← RANDOMIZED-PARTITION(A,p,r)
k ← q - p + 1
if i = k
    then return A[q]
elseif i < k
    then return RANDOMIZED-SELECT(A,p,q-1,i)
else return RANDOMIZED-SELECT(A,q+1,r,i-k)

最壞的情況下以線性時間執行

上面的演算法在最壞的情況下的執行時間是Θ

(n2),原因就是我們在最不幸運的時候每次劃分
然後出現一邊沒有元素,一邊n-1個元素的情況。這裡就是用一種方法來保證不會出現這種情況。怎麼來了咧
看書吧。。。。