算法導論: 第9章

9.1-1 同時找出最小值和次小值算法

比較過程同足球比賽淘汰賽階段同樣,兩兩比較,構成一個比較樹。次小值只會出如今哪些跟最小值比較過的元素中,這些元素總共有的數目跟樹高同樣,爲[lgn]。數組

因此,總共花費(n-1) + ([lgn]-1)排序

9.3-6 k分位數遞歸

先找第(k-1)/2個分位數,而後將數組分紅兩部分,在前一部分找(k-1)/2前的那些中位數,在後一部分找(k-1)/2後的那些中位數,則有T(k) = 2*T(k/2) + O(n)。每一層的代價均爲O(n),總共有lgk層。即爲O(nlgk)時間

9.3-7 最接近中位數的k個數比賽

step1:求出數組S的中位數的值:O(n)

step2:計算數組每一個數與中位數差的絕對值,存於另外一個數組B中:O(n)

step3:求出數組B中第k小的數ret:O(n)

step4:計算數組S中與ret差的絕對值小於ret的數並輸出:O(n)

9.3-8 兩個排序數組的中位數

(1)找個數組X、Y的中位數x1,y1:O(1)

(2)若是它們相等,這就是要找的中位數。

(3)若是x1 < y1,則遞歸,在X中比x1大的b部分和Y中比y1小的c部分中找。

(4)若是x1 > y1,則遞歸,在X中比x1小的a部分和Y中比y1大的d部分中找。

X:[a部分]x1[b部分]

Y:[c部分]y1[d部分]

9-2 帶權中位數

b) 使用最壞狀況時間爲O(nlgn)的排序算法對每一個元素進行排序

而後,依次累加元素的權重,直到知足題目中公式。

c)step1:利用SELECT中尋找中位數的算法,找到中位數

step2:用中位數把數組分爲三段,即A[1..q-1] < A[q] < A[q+1..r]

step3:計算A[1..q-1]和A[q+1..r]的權值和,看是否知足題目中的公式。

step4:若知足,A[q]就是所求的數。

step5:若不知足,就遞歸使用本算法進行查找。哪一半的權值和比0.5大,就在哪一半中找。

e)記f(x,y) = Sum{wi*(|x-xi| + |y-yi|)},即要最小化f(x,y)。

因爲f(x,y) = Sum{wi*(|x-xi| + |y-yi|)}

              = Sum{wi*|x-xi|} + Sum{wi*|y-yi|}

              = g(x) + h(y)

因此有min{f(x,y)} = minx,y{g(x) + h(y)} = minx{miny{g(x) + h(y)}} = minx{g(x) + miny{h(y)}} = minx{g(x)} + miny{h(y)}

即分別解決兩個一維帶權中位數問題便可。

相關文章
相關標籤/搜索