在一個有n個元素組成的集合中,第i個順序統計量是該集合中第i小的元素。中位元是出現在i=(n+1)/2處(下中位)或i=(n+1)/2+1處(上中位)。
9.1最小值和最大值
在一個有n個元素的集合中,要做多少次比較才能確定其最小元素呢?可以很容易地給出n-1這個上界:依次查看集合中的每個元素,並記錄比較過程中的最小元素。
n-1也是這個問題的比較次數下界:對於任意一個確定最小值的演算法,可以把它看做是在各元素之間進行的一場錦標賽,每次比較都是錦標賽中的一場比賽,兩個元素中較小的一方獲勝,有一點很關鍵,就是除了最終獲勝者之外,每個元素都少輸掉至少一場比賽;而至少有n-1場比賽。
同時找出最大值可最小值
我們可以獨立地找出最大值和最小值,各用n-1次比較。事實上,至多3(n/2)次比較久足以同時找到最小值和最大值。做法是記錄比較過程遇到的最小值和最大值。我們不是將每一個輸入元素與當前的最大值和最小值進行比較。而是成對地處理元素。先將一對輸入元素互相比較,然後把較大的與當前最大值進行比較,較小的與當前最小值進行比較,因此每對元素需要比較3次。
練習:
9.1-1證明:在最壞情況下,利用n+lgn-2次比較,即可以找到n個元素中的第2小的元素。
參考答案:(從網上找的答案)
將n個元素進行兩兩比較,將較大的淘汰,較小的留下。這樣通過n/2次比較就剩下n/2個元素。再進行第二輪;如此往複直到得出最小的元素。這個過程可以用一棵二叉樹來描述。那麼第二小的元素只有在於最小元素的比較才會被淘汰。最小的元素進行過的元素有lgn-1個。於是在進行lgn-2次比較就可以得出第二小的元素。
PS:這個解法的問題在於,如何記住與最小元素比較過的元素集合,難道要整棵樹建出來。這樣的話這個演算法沒有什麼實際意義。
9.2以期望線性時間做選擇
一般的選擇問題比找最小值的簡單問題更難,兩種問題的漸進已耗用時間卻是相同的都是Θ(n)。本節介紹一種解決選擇問題的分治演算法,即RANDOMIZED-SELECT演算法,以第七章的快速排序演算法為模型,如同在排序中一樣,對輸入的數組進行遞迴劃分,但和快速排序不同的是,快速排序會遞迴處理劃分的兩邊,而RANDOMIZED-SELECT只處理劃分的一邊。RANDOMIZED-SELECT的期望時間為Θ(n)。
RANDOMIZED-SELECT(A,p,r,i)
1 if p=r
2 then return A[p]
3 q<--RANDOMIZED-PARTITION(A,p,r)
4 k<--q-p+1
5 if i=k
6 then return A[q]
7 elseif i<k
8 then return RANDOMIZED-SELECT(A,p,q-1,i)
9 else return RANDOMIZED-SELECT(A,q+1,r,i-k)
RANDOMIZED-PARTITION就是快速排序演算法中的partition過程。
RANDOMIZED-SELECT的最壞已耗用時間是n2。期望已耗用時間為n。
思考題:
9-2帶權中位元
對分別具有正的權重w1,w2,...,wn且∑wi=1的n個不同元素x1,x2,...,xn,帶權中位元是滿足如下條件的元素xk:∑(xi<xk)<1/2且∑(xi>xk)<=1/2。
a)論證如果wi=1/n,那麼x1,x2,x3...,xn的中位元即是帶權中位元。
假設集合xi的中位元為xk,滿足xi<xk的元素個數和xi>xk的元素個數都約為n/2。所以滿足帶權中位元的定義。
b)說明如何通過排序求出n個元素的帶權中位元。
對xi進行排序,依照排序後的順序依次計算前k個權重的和。當第一次計算到某個位置發現權重和大於或等於1/2時,xk就為帶權中位元。
c)說明如何利用一的中位元演算法,來求帶權中位元。
以RANDOMIZED-SELECT演算法為例,我們以對xi的快速排序演算法為基礎,區別在於,我們不是尋找第k大的數,而是尋找使∑(xi<=xk)>=m滿足的最小k位置。演算法可以從RANDOMIZED-SELECT修改而來。
WRANDOMIZED-SELECT(A,p,r,m)
1 if p=r
2 then return A[p]
3 q<--RANDOMIZED-PARTITION(A,p,r)
4 計算A[p...q]的權重和m'
5 if m=m'
6 then return A[q]
7 elseif m<m'
8 then return WRANDOMIZED-SELECT(A,p,q-1,m)
9 else return WRANDOMIZED-SELECT(A,q+1,r,m'-m)
郵局位置問題:已知n個點p1,p2,...,pn即它們相練習的權重w1,w2,...,wn。我們希望能找到一點p(不一定是輸入焦點中的一個),使得何時∑wiD(p,pi)最小,此處D(a,b)表示點a與b之間的距離。
d)證明帶權中位元是一維郵局位置問題的最佳解決方案,其中所有的點都是實數。一維意味著d(a,b)=|a-b|。
首先證明p點必然可以是輸入焦點中的一點,採用反證法:假設p是pk和pk+1之間的一點。如果∑(i=1~k)wi>=1/2,那麼pk點將是一個更優(或同優)的點,pk+1將是一個更優的點。在再證明帶權中位元就是最優點,同樣採用反證法:假設pk是帶權中位點,那麼對於如果選取pl(l<k),那麼由於∑(i=1~l)wi<1/2,那麼pl+1是一個更優的點。如果選取pm(m>k),那麼由於∑(i=m~l)wi<1/2,那麼pm-1是一個更優的點。
e)找出二維郵局位置問題的最佳解答。其中所有的點都是(x,y)座標組,並且點a(x1,y1)和b(x2,y2)之間的距離是Manhanttan距離:d(a,b) = |x1-x2|+|y1-y2|。
只要分別從x1,x2,...,xn和y1,y2,...,yn找出帶權中位元xi,yj。那麼點(xi,yj)就是最佳位置。