我先簡要說明一下題意:
在一維座標軸上,有n個村莊,要把選一個郵局建在某個村莊上。要滿足一個要求:各個村莊到達這個郵局的距離之和的總和要最小。求郵局的最佳選址。
一:論證郵局問題的最優解是帶權中位數:
先了解一些符號的意思:
D[I]—第I個點的權值
DIST(I,J)—I到J點的距離,即DIST(I,J)=|NUM[I]-NUM[J]|
由定義式易知:DIST(I,J)=DIST(I,J)
若最優點在T
則有:
∑{D[I]*DIST(I,T)}(I<>T) <= ∑{D[I]*DIST(I,T+1)}(I<>T+1)
//最優點的到點的距離之和明顯不大於其他點的,當然T+1也不例外。
∑{D[L]}*DIST(L,T)}+∑{D[R]*DIST(R,T)}+D[T+1]*DIST(T+1,T) <=∑{D[L]}*DIST(L,T+1)}+∑{D[R]*DIST(R,T+1)}+D[T]*DIST(T,T+1) (L<T&R>T+1)
//所有點到可以分成三類:T左邊的點爲L類,T+1右邊的點爲R類,T或T+1點自成一類。
整理得:
∑{D[L]*DIST(L,T+1)}-∑{D[L]*DIST(L,T)}(L<T)+D[T]*(DIST(T,T+1))>=∑{D[R]*DIST(R,T)}-∑(D[R]*DIST(R,T+1))(R>T+1)+D[T+1]*(DIST(T,T+1))
//將於L相關的放在一邊,與R相關的放在另一邊。
∑{D[L]*(DIST(L,T)-DIST[L,T+1])}(L<=T)<=∑{D[R]*(DIST(R,T+1)-DIST(R,T))}(R>=T+1)
//這裏要注意的是T和R的定義已經發生了變化,L<=T R>=T+1。定義的變化是爲式子更加整潔。然後將上式子兩邊同乘以-1,並且把公因數提取出來。
因爲
DIST(L,T)-DIST(L,T+1)=DIST(T,T+1)
DIST(R,T+1)-DIST(R,T)=DIST(T+1,T)
DIST(T,T+1)=DIST(T+1,T)
所以
∑{D[L]*DIST(T,T+1)*(-1)(L<=T)<=∑{D[R]*DIST(T+1,T)
*(-1)}(R>=T+1)
∑D[L](L<=T)>=∑(D[R])(R>=T+1)
//兩邊消掉DIST(T,T+1)*(-1)
即:∑D[L](L<T)+D[T]>=∑(D[R])(R>T)
而類似的,我們可以證明其右邊的權值和加上D[T]後大於左邊的權值和,只要將第一步改成:
∑{D[I]*DIST(I,T)}(I<>T) <= ∑{D[I]*DIST(I,T-1)}(I<>T-1)
其他的步驟類似。
因爲左邊的權值和數+D[T]>=右邊的權值和,那麼: LEFTSUM+D[T]>=RIGHTSUM=SUMALL-(LEFTSUM+D[T]) =>2*(LEFTSUM+D[T])>=SUMALL =>2*RIGHTSUM<=SUMALL
同理可得: 2*LEFTSUM<=SUMALL
綜上所述:
RIGHTSUM <= SUMALL/2
LEFTSUM<=SUMALL/2
很明顯,我們假設的最優點既是帶權中位數。
證畢。
二:求出n個元素的帶權中位數:
思路:
SUM爲1..n號元素的和。
先假設帶權中位數就是val[n/2],通過遍歷1..n/2-1求出他們的和leftSum,
同理n/2+1..n號元素的和爲rightSum。
如果leftSum < SUM /2 且 rightSum < SUM / 2, 那麼顯然val[n/2]必然爲帶權中位數。
當 leftSum > SUM / 2,帶權中位數必然在左邊,因爲如果在右邊,那麼leftSum依然大於SUM / 2,矛盾。
此時把權重rightSum加到val[n/2]的權重上,我們不必關心每個值的具體權重,因爲對帶權中位數而言,右邊的val的權重的和只要不變,就對它毫無影響。而val[n/2]一定在帶權中位數右邊,所以可以把權重rightSum加到val[n/2]的權重上。
此時只要遞歸從1..n/2中找即可。
如果rightSum > SUM /2 且 leftSum < SUM / 2,道理是一樣的。
複雜度分析:
計算SUM. O(n)
遞歸找帶權中位數:
T(n) = O(n) + O(n/2) + O(n/4) + O(n/8)..O(n/2i) + T(n/2i+1)
令n/2i+1 = 1
所以T(n/2i+1) = T(1)
所以T(n) = c * (n + n/2 + n/4 ...n/2i) + T(1) < 2 * cn + 1 = O(n)
綜上所述
O(n) + T(n) < O(n) * 2 = O(n)
僞代碼就不寫了,很容易百度出來。