算法設計與分析課程複習筆記6——統計算法
統計算法
修路問題
Given (x,y) coordinates of N houses, where should you build road parallel to x-axis to minimize construction cost of building driveways?
最終正確的解決方案:將街道置於Y座標的中間
序列統計
- 求極大和極小
- 求第k小元素
求極小或極大
Minimum(A)
min←A[1]
for i=2……n
do if A[i] < min
then min ← A[i]
return min
Lemma: The minimum or maximum of a set of n elements can be found using n – 1 comparisons.(通過n-1次比較能找到n個元素的極大或極小)
同時求極大和極小
簡單答案:極大和極小可通過2n-2次比較得到
更好的辦法:
Min-Max(A)
for i = 1…n / 2
do if A[2i – 1] ≤ A[2i]
then B[i] ← A[2i – 1]
C[i] ← A[2i]
else B[i] ← A[2i]
C[i] ← A[2i – 1]
min ← Minimum(B)
max ← Maximum(C)
return (min, max)
n/2次得到B和C,從B中找到最小的,從C中找到最大的。
總共比較次數:3n/2-2
從序列中選出第i小元素
想法:
用快速排序中的分割算法對序列進行分割
在分割後的一邊尋找第i小元素,需要與分割中心位置比較
時間開銷:
可以以Θ(n)開銷完成
隨機選擇算法
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 //pivot value is the answer
then return A[q]
else if i < k
then return RANDOMIZED-SELECT(A, p, q-1, i )
else return RANDOMIZED-SELECT(A, q + 1, r, i-k)
分析:
最壞情況: 以最大或最小爲分割中心,分隔開銷Θ(n)
平均情況:
更好的選擇算法
在最壞情況下選擇開銷爲O(n)
採用改進的分割方法,不再是以序列的最後一個元素爲分割中心
- 分成n/5組
- 找到每組的中值
- 找到n/5組中值的中值x
- 運用改進的分割算法在x處分割
- 如果i=k,返回x結束;否則,在左右遞歸求解
example:
尋找第6小的元素
A = {12, 34, 0, 3, 22, 4, 17, 32, 3, 28, 43, 82, 25, 27,
34, 2 ,19 ,12 ,5 ,18 ,20 ,33, 16, 33, 21, 30, 3, 47}
1.分成n/5組。
1️⃣12,34,0,3,22
2️⃣4,17,32,3,28
3️⃣43,82,25,27,34
4️⃣2,19,12,5,18
5️⃣20,33,16,33,21
6️⃣30,3,47
2.找到每組的中值。
1️⃣0,3,12,22,34
2️⃣3,4,17,28,32
3️⃣25,27,34,43,82
4️⃣2,5,12,18,19
5️⃣16,20,21,33,33
6️⃣3,30,47
3.找到n/5組中值的中值x。
12,12,17,21,30,34
4. 運用改進的分割算法在x處分割。
第一部分:12, 0, 3, 4, 3, 2, 12, 5, 16, 3
pivot:17【position of the pivot is q = 11】
第二部分:34, 22, 32, 28, 43, 82, 25, 27, 34, 19, 18, 20, 33, 33, 21, 30, 47
5.在第一部分遞歸求解。
1.O(n)
2.O(n)
3.T(n/5)
4.O(n)
5.≤ T(7n/10 + 6)——閱讀教材
T(n)=T(n/5)+T(7n/10 + 6)+O(n)
參考:任課教師邱德紅教授的課件