算法导论 思考题9-2

9-2 (带权中位数)对分别具体以正权重 w 1 , w 2 , ⋯   , w n w_1,w_2,\dotsb,w_n w1,w2,,wn,且满足 ∑ i = 1 n w i = 1 \sum_{i=1}^{n}{w_i=1} i=1nwi=1 n n n个互异的元素 x 1 , x 2 , ⋯   , x n x_1,x_2,\dotsb,x_n x1,x2,,xn来说,带权中位数 x k x_k xk(较小中位数)是满足如下条件的元素:

∑ x i < x k w i < 1 2 和 ∑ x i > x k w i ≤ 1 2 \sum_{x_i < x_k}w_i <\frac{1}{2} \quad和\quad\sum_{x_i > x_k}w_i \leq \frac{1}{2} xi<xkwi<21xi>xkwi21

例如,如果元素是 0.1   , 0.35   , 0.05   , 0.1   , 0.15   , 0.05   , 0.2 0.1 \ ,0.35 \ ,0.05 \ ,0.1 \ ,0.15 \ ,0.05 \ ,0.2 0.1 ,0.35 ,0.05 ,0.1 ,0.15 ,0.05 ,0.2,并且每个元素的权重等于本身(即对所有 i = 1 , 2 , ⋯   , 7 都 有 w i = x i i=1,2,\dotsb,7都有w_i=x_i i=1,2,,7wi=xi),那么中位数是0.1,而带全中位数是0.2。

a.  证明:如果对所有 i = 1 , 2 , ⋯   , n i=1,2,\dotsb,n i=1,2,,n都有 w i = 1 / n w_i=1/n wi=1/n,那么 x 1 , x 2 , ⋯   , x n x_1,x_2,\dotsb,x_n x1,x2,,xn的中位数就是 x i x_i xi的带权中位数。

证明: x i , x 2 , ⋯   , n x_i,x_2,\dotsb,n xi,x2,,n的中位数(题目给的是低中位数)是 x k = x x_k=x xk=x那么就有:

∣ { x i ∣ 1 ≤ i ≤ n , x i < x } ∣ < n / 2 ∣ { x i ∣ 1 ≤ i ≤ n , x i > x } ∣ ≤ n / 2 \begin{aligned} |\{x_i| 1 \leq i \leq n,x_i < x\}| &< n/2 \\ |\{x_i| 1 \leq i \leq n,x_i > x\}| &\leq n/2 \end{aligned} {xi1in,xi<x}{xi1in,xi>x}<n/2n/2
这里解释下:

第1个式子是小于中位数的个数,因为是低中位数,无论集合是奇数偶数个都是小于 n / 2 n/2 n/2

第2个式子是大于中位数的个数,当集合个数是奇数是,也是小于 n / 2 n/2 n/2,当集合个数为偶数时,等号成立。

同时因为每一个元素的权值都是置为 1 / n 1/n 1/n,那么就有:
∑ x i < x w i = ∑ x i < x 1 n = 1 n ⋅ ∑ x i < x 1 = 1 n ⋅ ∣ { x i ∣ 1 ≤ i ≤ n , x i < x } ∣ < 1 n ⋅ n 2 = 1 2 \begin{aligned} \sum_{x_i<x}{w_i} &= \sum_{x_i<x}{\frac{1}{n}} \\ &= \frac{1}{n}·\sum_{x_i<x}1 \\ &= \frac{1}{n}·|\{x_i| 1 \leq i \leq n,x_i <x\}| \\ &< \frac{1}{n} · \frac{n}{2} \\ &= \frac{1}{2} \end{aligned} xi<xwi=xi<xn1=n1xi<x1=n1{xi1in,xi<x}<n12n=21
满足带权中位数的第一个条件。同理,我们有:

∑ x i > x w i = ∑ x i > x 1 n = 1 n ⋅ ∑ x i > x 1 = 1 n ⋅ ∣ { x i ∣ 1 ≤ i ≤ n , x i > x } ∣ ≤ 1 n ⋅ n 2 = 1 2 \begin{aligned} \sum_{x_i>x}{w_i} &= \sum_{x_i>x}{\frac{1}{n}} \\ &= \frac{1}{n}·\sum_{x_i>x}1 \\ &= \frac{1}{n}·|\{x_i| 1 \leq i \leq n,x_i > x\}| \\ &\leq \frac{1}{n}·\frac{n}{2} \\ &=\frac{1}{2} \end{aligned} xi>xwi=xi>xn1=n1xi>x1=n1{xi1in,xi>x}n12n=21

第二个条件得证。因此当集合X的每个元素的权重都是 1 / n 1/n 1/n时, x 1 , x 2 , ⋯   , x n x_1,x_2,\dotsb,x_n x1,x2,,xn的中位数 x k = x x_k=x xk=x,同时也是带权中位数。


b.  利用排序,设计一个最坏情况下 O ( n l g n ) O(nlgn) O(nlgn)时间的算法,可以得到 n n n个元素的带权中位数。

Step1、可以对元素 x 1 , x 2 , ⋯   , x n x_1,x_2,\dotsb,x_n x1,x2,,xn采用归并排序或者堆排序算法来升序排序。

Step2、然后从最小 x 1 x_1 x1开始,从左往右遍历每一个,将权值累加起来,当权值超过 1 / 2 1/2 1/2,那么最后一个导致超过 1 / 2 1/2 1/2的元素就是带权中位数。

Step1时间复杂度为 O ( n l g n ) O(nlgn) O(nlgn),Step2时间复杂度为 O ( n ) O(n) O(n)。满足题目要求。


c. 说明如何利用像9.3节的SELECT这样的线性时间中位数算法,在 Θ ( n ) \Theta(n) Θ(n)最坏情况时间内求出带权中位数。

线性时间查找带权中位数的思想是二分查找。算法工作流程如下:

1、问题规模 n ≤ 2 n \leq 2 n2,可以在 O ( 1 ) O(1) O(1)情况下暴力解决。

2、问题规模 n > 2 n > 2 n>2时,我们先找到集合 X X X的中位数 x k = x x_k =x xk=x,将集合 X X X x k x_k xk划分为两个集合,下面称为 L = { x i ∣ 1 ≤ i ≤ n , x i < x } L=\{x_i|1 \leq i \leq n,x_i < x\} L={xi1in,xi<x} G = { x i ∣ 1 ≤ i ≤ n , x i > x } G=\{x_i|1 \leq i \leq n,x_i >x\} G={xi1in,xi>x},然后计算 W L W_L WL W G W_G WG(两部分的权重)。根据 W G W_G WG W G W_G WG的权重情况,可以分为3种情况处理:

{ a 、 x k 即 为 带 权 中 位 数 W L < 1 / 2   a n d   W G < 1 / 2 b 、 在 集 合 L 中 查 找 W L > 1 / 2 c 、 在 集 合 G 中 查 找 W G > 1 / 2 \begin{cases} a、 x_k即为带权中位数 & W_L < 1/2 \ and \ W_G <1/2 \\ b、 在集合L中查找 & W_L>1/2 \\ c、 在集合G中查找 & W_G>1/2 \end{cases} axkbLcGWL<1/2 and WG<1/2WL>1/2WG>1/2

在处理b、c情况时,我们为了避免下一次划分时重复计算 W L W_L WL W G W_G WG,对于情况b:我们可以将 w k = w k + W G w_k=w_k+W_G wk=wk+WG,然后将 x k x_k xk加入下一步要进行查找的集合 L L L中。

下面时该算法的伪代码:

WEIGHTED-MEDIUM(X)
    //规模小于等于2,O(1)解决
    if X.size = 1
        return x[1]
    elseif x.size = 2
        if w[1]>=w[2]
            return x1
        else
            return x2
    //规模 >2,取中位数,二分递归进行
    else
        find the Medium x[k] in X[1,..,n]
        partition the set X by x[k] into L,G
        computer WL=sum of w[i] in the set L
                 WG=sum of w[i] in the set G
        if WL<1/2 and WG < 1/2
            return x[k]
        elseif WL > 1/2
            w[k]=w[k]+WG
            X'<--{x[i] in X | x[i] <= x[k]}
            return WEIGHT-MEDIUM(X')
        else
            w[k]=w[k]+WL
            X'<--{x[i] in X | x[i] >= x[k]}
            return WEIGHTED-MEDIUM(X')

算法分析:在对数组的每一次递归过程中,取中位数 x k x_k xk,划分集合X和计算 W L , W R W_L,W_R WL,WR的时间复杂度均为 O ( n ) O(n) O(n)。最差情况下满足以下递归式:
T ( n ) = T ( n / 2 + 1 ) + Θ ( n ) T(n)=T(n/2+1)+\Theta(n) T(n)=T(n/2+1)+Θ(n)

下一次递归,划分的集合是原来的一半元素,同时还有 x k x_k xk,因此为 T ( 2 n + 1 ) T(2n+1) T(2n+1)
这个递归式和快速选择(线性选择算法)的递推式接近,该算法的时间复杂度 T ( n ) = Θ ( n ) T(n)=\Theta(n) T(n)=Θ(n)


邮局位置问题的定义如下,给定权重分别为 w 1 , w 2 , ⋯   , w n w_1,w_2,\dotsb,w_n w1,w2,,wn n n n个点 p 1 , p 2 , ⋯   , p n p_1,p_2,\dotsb,p_n p1,p2,,pn,我们希望找到一个点 p p p(不一定是输入点中的一个),使得 ∑ i = 1 n w i d ( p , p i ) \sum_{i=1}^{n}{w_id(p,p_i)} i=1nwid(p,pi)最小,这里 d ( a , b ) d(a,b) d(a,b)表示点 a a a b b b之间的距离。

d. 证明:对一维邮局位置问题,带权中位数是最好的解决方法,其中,每个点都是一个实数,点 a a a b b b之间的距离是 d ( a , b ) = ∣ a − b ∣ d(a,b)=|a-b| d(a,b)=ab

 采用 x 1 , x 2 , ⋯   , x n x_1,x_2,\dotsb,x_n x1,x2,,xn表示 n n n个点的坐标,每个点相应的权值为 w 1 , w 2 , ⋯   , w n w_1,w_2,\dotsb,w_n w1,w2,,wn,令 x = x k x=x_k x=xk为带权中位数。

 对于任意点 p p p,我们设函数 f ( p ) = ∑ i = 1 n w i ∣ p − x i ∣ f(p)=\sum_{i=1}^n{w_i|p-x_i|} f(p)=i=1nwipxi,我们需要找出令该函数最小值的点。令 y y y是除 x x x外的任意点,我们通过证明 f ( y ) − f ( x ) ≥ 0 f(y)-f(x) \geq 0 f(y)f(x)0来检验带权中位数 x x x是最优解。我们可以分为下面两种情况来讨论: y > x y > x y>x x > y x > y x>y。对于 ∀   x , y \forall \ x,y  x,y有:

f ( y ) − f ( x ) = ∑ i = 1 n w i ∣ y − x i ∣ − ∑ i = 1 n w i ∣ x − x i ∣ = ∑ i = 1 n w i ( ∣ y − x i ∣ − ∣ x − x i ∣ ) \begin{aligned} f(y)-f(x) &=\sum_{i=1}^{n}{w_i|y-x_i|} -\sum_{i=1}^{n}{w_i |x-x_i|} \\ &=\sum_{i=1}^{n}{w_i(|y-x_i|-|x-x_i|)} \end{aligned} f(y)f(x)=i=1nwiyxii=1nwixxi=i=1nwi(yxixxi)

1、 当 y > x y>x y>x时,对于上面式子中的 ∣ y − x i ∣ − ∣ x − x i ∣ |y-x_i|-|x-x_i| yxixxi可以分为三种情况:

 1.1、 x < y ≤ x i x < y \leq x_i x<yxi

∣ y − x ∣ + ∣ y − x i ∣ = ∣ x − x i ∣ A N D ∣ y − x ∣ = y − x → ∣ y − x i ∣ − ∣ x − x i ∣ = − ∣ y − x ∣ = x − y \frac{|y-x|+|y-x_i|=|x-x_i| \quad AND \quad |y-x|=y-x} {\to |y-x_i|-|x-x_i|=-|y-x|=x-y} yxixxi=yx=xyyx+yxi=xxiANDyx=yx

 1.2、 x < x i ≤ y x < x_i \leq y x<xiy

∣ y − x i ∣ ≥ 0 A N D ∣ x − x i ∣ ≤ y − x → ∣ y − x i ∣ − ∣ x − x i ∣ ≥ − ( y − x ) = x − y \frac{|y-x_i| \geq 0 \quad AND \quad |x-x_i| \leq y-x} {\to |y-x_i|-|x-x_i| \geq -(y-x) = x-y} yxixxi(yx)=xyyxi0ANDxxiyx

 1.3、 x i ≤ x < y x_i \leq x < y xix<y,类似1.1
∣ x − x i ∣ + ∣ y − x ∣ = ∣ y − x i ∣ A N D ∣ y − x ∣ = y − x → ∣ y − x i ∣ − ∣ x − x i ∣ = ∣ y − x ∣ = y − x \frac{|x-x_i|+|y-x|=|y-x_i| \quad AND \quad |y-x|=y-x}{\to |y-x_i|-|x-x_i|=|y-x|=y-x} yxixxi=yx=yxxxi+yx=yxiANDyx=yx

解释一下上面这么写的原因,如:1.1, d ( x , x i ) = = d ( x , y ) + d ( y , x i ) d(x,x_i)==d(x,y)+d(y,x_i) d(x,xi)==d(x,y)+d(y,xi),绝对值内的减法理解为距离计算,配凑出与我们要求的式子,进行等价转换,后面方便处理。

其实对于1.1和1.3我们简单根据正负情况消去绝对值符号也行。

 将前两种情况( x < x i x < x_i x<xi)与第三种情况分开( x i ≤ x x_i \leq x xix)。。我们有:
f ( y ) − f ( x ) = ∑ i = 1 n w i ( ∣ y − x i ∣ − ∣ x − x i ∣ ) ≥ ∑ x < x i w i ( x − y ) + ∑ x ≥ x i w i ( y − x ) = ( y − x ) ( ∑ x ≥ x i w i − ∑ x < x i w i ) \begin{aligned} f(y)-f(x) &= \sum_{i=1}^{n}{w_i(|y-x_i|-|x-x_i|)} \\ &\geq \sum_{x<x_i}{w_i(x-y)}+\sum_{x \geq x_i}{w_i(y-x)} \\ &= (y-x)\left(\sum_{x \geq x_i}{w_i}-\sum_{x < x_i}{w_i}\right) \end{aligned} f(y)f(x)=i=1nwi(yxixxi)x<xiwi(xy)+xxiwi(yx)=(yx)(xxiwix<xiwi)

结合 x k x_k xk的性质,我们有:

∑ x i < x w i < 1 / 2 i m p l i e s → ∑ x i ≤ x w i ≥ 1 / 2 和 ∑ x i > x w i ≤ 1 / 2 ∴ ∑ x ≥ x i w i − ∑ x < x i w i ≥ 0 \begin{aligned} \sum_{x_i < x}{w_i} <1/2 \quad \underrightarrow{implies} & \sum_{x_i \leq x}{w_i} \geq 1/2 \\ 和 \sum_{x_i>x}{w_i} &\leq 1/2 \\ \therefore \sum_{x \geq x_i}{w_i}-\sum_{x < x_i}{w_i} &\geq 0 \end{aligned} xi<xwi<1/2 impliesxi>xwixxiwix<xiwixixwi1/21/20
∵ y − x > 0 \because y-x >0 yx>0 ∴ f ( y ) − f ( x ) ≥ 0 \therefore f(y)-f(x) \geq 0 f(y)f(x)0

2、当 x > y x > y x>y时,我们同样将 ∣ y − x i ∣ − ∣ x − x i ∣ |y-x_i|-|x-x_i| yxixxi分为下面三种情况:

 2.1、 x i ≤ y < x x_i \leq y < x xiy<x

∣ y − x i ∣ + ∣ x − y ∣ = ∣ x − x i ∣ A N D ∣ x − y ∣ = x − y → ∣ y − x i ∣ − ∣ x − x i ∣ = − ∣ x − y ∣ = y − x \frac{|y - x_i|+|x - y|=|x-x_i|\quad AND \quad |x-y|=x-y} {\to |y-x_i|-|x-x_i|=-|x-y|=y-x} yxixxi=xy=yxyxi+xy=xxiANDxy=xy

 2.2、 y ≤ x i < x y \leq x_i < x yxi<x
∣ y − x i ≥ 0 ∣ A N D ∣ x − x i ∣ ≤ x − y → ∣ y − x i ∣ − ∣ x − x i ∣ ≥ − ( x − y ) = y − x \frac{|y-x_i \geq 0| \quad AND \quad |x_-x_i| \leq x-y} {\to |y-x_i|-|x-x_i| \geq -(x-y)=y-x} yxixxi(xy)=yxyxi0ANDxxixy

 2.3、 y < x ≤ x i y < x \leq x_i y<xxi,类似情况1

∣ x − y ∣ + ∣ x − x i ∣ = ∣ y − x i ∣ A N D ∣ x − y ∣ = x − y → ∣ y − x i ∣ − ∣ x − x i ∣ = ∣ x − y ∣ = x − y \frac{|x-y|+|x-x_i|=|y-x_i| AND |x-y|=x-y} {\to |y-x_i|-|x-x_i|=|x-y|=x-y} yxixxi=xy=xyxy+xxi=yxiANDxy=xy

 和之前处理一样,分为前两种情况为 x i < x x_i < x xi<x,第三种情况为 x ≤ x i x \leq x_i xxi,我们有:

f ( y ) − f ( x ) = ∑ i = 1 n w i ( ∣ y − x i ∣ − ∣ x − x i ∣ ) ≥ ∑ x i < x w i ( y − x ) + ∑ x ≤ x i w i ( x − y ) = ( y − x ) ( ∑ x i < x w i − ∑ x ≤ x i w i ) \begin{aligned} f(y)-f(x) &=\sum_{i=1}^{n}{w_i(|y-x_i|-|x-x_i|)} \\ &\geq \sum_{x_i<x}{w_i(y-x)} +\sum_{x\leq x_i}{w_i(x-y)} \\ &=(y-x)\left(\sum_{x_i<x}{w_i}-\sum_{x \leq x_i}{w_i} \right)\\ \end{aligned} f(y)f(x)=i=1nwi(yxixxi)xi<xwi(yx)+xxiwi(xy)=(yx)(xi<xwixxiwi)

同上, ∵ x \because x x是带权中位数,有:
∑ x i < x w i < 1 / 2 和 ∑ x i > x w i ≤ 1 / 2 i m p l i e s → ∑ x i ≥ x w i > 1 / 2 ∴ ∑ x i < x w i − ∑ x ≤ x i w i > 0 \begin{aligned} \sum_{x_i < x}{w_i} &< 1/2 \\ 和 \sum_{x_i >x}{w_i} \leq 1/2 \quad &\underrightarrow{implies} \sum_{x_i \geq x}{w_i} > 1/2 \\ \therefore \sum_{x_i < x}{w_i}-\sum_{x \leq x_i}{w_i} &>0 \end{aligned} xi<xwixi>xwi1/2xi<xwixxiwi<1/2 impliesxixwi>1/2>0

∵ y − x > 0 ∴ f ( y ) − f ( x ) > 0 \because y-x>0 \therefore f(y)-f(x)>0 yx>0f(y)f(x)>0

综上:
f ( y ) − f ( x ) { ≥ 0 y > x > 0 x > y f(y)-f(x) \begin{cases} \geq 0 & y > x\\ > 0 & x > y \end{cases} f(y)f(x){0>0y>xx>y
因此,带权中位数 x = x k x=x_k x=xk是一维邮局问题的最优解,得证。


e. 请给出二位邮局位置问题的最好解决方法:其中的点是 ( x , y ) (x,y) (x,y)的二位坐标形式,点 a = ( x 1 , y 1 ) a=(x_1,y_1) a=(x1,y1) b = ( x 2 , y 2 ) b=(x_2,y_2) b=(x2,y2)之间的距离是 M a n h a t t a n Manhattan Manhattan距离(曼哈顿距离/出租车距离/街区距离),即 d ( a , b ) = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ d(a,b)=|x_1-x_2|+|y_1-y_2| d(a,b)=x1x2+y1y2

 我们采用一对坐标来表示每个点 p i = ( x i , y i ) p_i=(x_i,y_i) pi=(xi,yi),同时每个点相应的权值为 w i w_i wi。因此,我们的目标转变为找到一个点 p = ( x , y ) p=(x,y) p=(x,y)使下面的函数达到最小值:

f ( x , y ) = ∑ i = 1 n w i ( ∣ x − x i ∣ + ∣ y − y i ∣ ) f(x,y)=\sum_{i=1}^{n}{w_i(|x-x_i|+|y-y_i|)} f(x,y)=i=1nwi(xxi+yyi)

 我们可以将函数 f ( x , y ) f(x,y) f(x,y)转变为两个等价的一元函数相加:

f ( x , y ) = g ( x ) + h ( y ) 其 中 , g ( x ) = ∑ i = 1 n w i ∣ x − x i ∣ h ( y ) = ∑ i = 1 n w i ∣ y − y i ∣ \begin{aligned} f(x,y)&=g(x)+h(y)\\ 其中,g(x) &=\sum_{i=1}^{n}{w_i|x-x_i|} \\ h(y) &=\sum_{i=1}^{n}{w_i|y-y_i|} \end{aligned} f(x,y)g(x)h(y)=g(x)+h(y)=i=1nwixxi=i=1nwiyyi

我们要使 f ( x , y ) f(x,y) f(x,y)取得最小值,可以单独的对每一维度进行处理,因为 g ( x ) g(x) g(x)不依赖于变量 y , h ( y ) y,h(y) yh(y)不依赖于变量 x x x。因此:

min ⁡ x , y f ( x , y ) = min ⁡ x , y ( g ( x ) + h ( y ) ) = min ⁡ x ( min ⁡ y ( g ( x ) + h ( y ) ) ) = min ⁡ x ( g ( x ) + min ⁡ y h ( y ) ) = min ⁡ x g ( x ) + min ⁡ y h ( y ) \begin{aligned} \min_{x,y}{f(x,y)} &= \min_{x,y}{(g(x)+h(y))} \\ &= \min_{x} \left(\min_{y}(g(x)+h(y))\right) \\ &= \min_{x} \left(g(x)+ \min_{y}h(y) \right) \\ &= \min_{x}g(x)+\min_{y}h(y) \end{aligned} x,yminf(x,y)=x,ymin(g(x)+h(y))=xmin(ymin(g(x)+h(y)))=xmin(g(x)+yminh(y))=xming(x)+yminh(y)

 原先的二维问题,现在问题就转变为求2个一维最优解问题。和我们上面问题 d d d一样,因此,我们只要分别求 x 、 y x、y xy维度上的带权中位数,设为 x k , y k x_k,y_k xk,yk。最终答案记为 ( x k , y k ) (x_k,y_k) (xk,yk)

你可能感兴趣的:(算法导论,算法导论)