郵局問題的相關討論

 我先簡要說明一下題意:

    在一維座標軸上,有n個村莊,要把選一個郵局建在某個村莊上。要滿足一個要求:各個村莊到達這個郵局的距離之和的總和要最小。求郵局的最佳選址。

一:論證郵局問題的最優解是帶權中位數:

先了解一些符號的意思:

D[I]I個點的權值   

DIST(IJ)IJ點的距離,即DIST(IJ)=|NUM[I]-NUM[J]  

由定義式易知:DIST(IJ)=DIST(IJ)

若最優點在  

則有:   

{D[I]*DIST(IT)}(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類,TT+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)

//這裏要注意的是TR的定義已經發生了變化,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(IT)}(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個元素的帶權中位數:

思路:

SUM1..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)

僞代碼就不寫了,很容易百度出來。

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