算法導論中的一道題

設X[1,...,n]和Y[1,...,n]爲兩個數組,每個都包含n個已排好序的數。給出一個求數組X和Y中所有2n個元素的中位數的、O(lgn)時間的算法。

1.首先找到X和Y的中位數xm,ym,O(1)的時間。

2.因此可以用xm,ym將X,Y進行等分:X[1,2,...,n/2-1] ,xm,X[n/2+1,n/2+2,...,n] 和Y[1,2,...,n/2-1] ,ym,Y[n/2+1,n/2+2,...,n] .

3.我們可以對xm和ym進行考慮:若ym>xm,那麼在xm的左邊都會<ym,因此可以用二分法在xm的右邊找到等於ym或第一個大於ym的數xc,同理可以對xm在ym的右邊找到一個開始小於或等於ym的數yc,則可以統計xc與yc之間的距離(這個要在找xc和yc的同時,記錄兩者到xm、ym的距離,這樣就不會將算法時間上升到O(n)),然後用O(1)的時間進行選擇得到2n個數的中位數。

 

感覺是對的,但還沒有驗證過。

下面是另外一題:

解法:

就是這麼道題,首先該怎麼選擇呢?當然我們可以列一個式子:對每一個油井有x,y座標,這裏假設x座標爲東西方向,則y座標爲南北方向。因此,對於x沒有信息可言,則只要考慮y座標就行了。對於n個油井可以表示成Y=(y1,y2,...,yn).這裏設主幹道的y座標爲c,則可以求一個最小表達式:
f(c) = (y1-c).^2+(y2-c).^2 + ... + (yn-c).^2
只要求得f(c)的最小時的c,問題就解決了。
那麼,我們有什麼解決過如此的方法嗎?嗯,好像可以用最小二乘法了。或者用求導的辦法去解決,但要知道這個二次曲線是不是在導數爲0處爲最小值呢?當然可以求一下,這裏可以求得c=(y1+y2+...+yn)/n.感覺這是求得一個平均數,將n=2時直接導出這是中位數。ok,中位數。那麼是不是呢? 怎麼證明?其實,可以這樣連接:這裏看圖最左邊的兩個點,那麼這兩個點到在兩個點之間的直線的距離是永遠不變的,即爲一個常量(不能越過兩個點中的任何一個,否則就不是常數了)。因此,可以爲每兩個點配對,則,只要直線落在所有配對兩點之間,就是一條使得點到直線的距離最短。那麼我們還可以將此轉換成求中位數的問題,因爲,只要直線穿過中位數的那個點,就能保證所有配對點都在直線的兩邊。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章