演算法導論 學習筆記 第九章 中值和順序統計
阿新 • • 發佈:2019-02-15
本章其實只講了一個問題,那就是如何從一個數組當中用線性時間內找出第i個小的元素。
最小值和最大值
這個就比較簡單了,直接挨個比,執行時間就是線性的,而且這就是最好的辦法。
如何同時找出最小值和最大值咧?
這個其實也簡單,那就記錄兩個資料唄。執行時間是找單個的兩倍。
但是這個就不是最好的辦法了。有一個比這個更好的方法。上面的辦法是每一個元素需要比較兩次,
而下面的方法是每兩個元素需要比較三次。比上一個好一點
那就是我們不去一個一個比較,而是一對一對的比較,然後把小的跟最小值比較,大的跟最大值比較。厲害吧。
期望線性時間內的選擇問題(這個翻譯總感覺不通順)平均情況嘛
就是我們平時的選擇,不可能總是要求我們找出最小值和最大值。但是儘管不是找出最小值和最大值,平均情況下我們依然可以線上性時間內完成。
用的核心思想是分治法。最壞的情況下執行時間是
上虛擬碼
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個元素的情況。這裡就是用一種方法來保證不會出現這種情況。怎麼來了咧
看書吧。。。。