∑ 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<xk∑wi<21和xi>xk∑wi≤21
例如,如果元素是 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,⋯,7都有wi=xi),那么中位数是0.1,而带全中位数是0.2。
证明: 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} ∣{xi∣1≤i≤n,xi<x}∣∣{xi∣1≤i≤n,xi>x}∣<n/2≤n/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<x∑wi=xi<x∑n1=n1⋅xi<x∑1=n1⋅∣{xi∣1≤i≤n,xi<x}∣<n1⋅2n=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>x∑wi=xi>x∑n1=n1⋅xi>x∑1=n1⋅∣{xi∣1≤i≤n,xi>x}∣≤n1⋅2n=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,同时也是带权中位数。
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)。满足题目要求。
线性时间查找带权中位数的思想是二分查找。算法工作流程如下:
1、问题规模 n ≤ 2 n \leq 2 n≤2,可以在 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={xi∣1≤i≤n,xi<x}和 G = { x i ∣ 1 ≤ i ≤ n , x i > x } G=\{x_i|1 \leq i \leq n,x_i >x\} G={xi∣1≤i≤n,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} ⎩⎪⎨⎪⎧a、xk即为带权中位数b、在集合L中查找c、在集合G中查找WL<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之间的距离。
采用 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=1nwi∣p−xi∣,我们需要找出令该函数最小值的点。令 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=1∑nwi∣y−xi∣−i=1∑nwi∣x−xi∣=i=1∑nwi(∣y−xi∣−∣x−xi∣)
1、 当 y > x y>x y>x时,对于上面式子中的 ∣ y − x i ∣ − ∣ x − x i ∣ |y-x_i|-|x-x_i| ∣y−xi∣−∣x−xi∣可以分为三种情况:
1.1、 x < y ≤ x i x < y \leq x_i x<y≤xi
∣ 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} →∣y−xi∣−∣x−xi∣=−∣y−x∣=x−y∣y−x∣+∣y−xi∣=∣x−xi∣AND∣y−x∣=y−x
1.2、 x < x i ≤ y x < x_i \leq y x<xi≤y
∣ 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} →∣y−xi∣−∣x−xi∣≥−(y−x)=x−y∣y−xi∣≥0AND∣x−xi∣≤y−x
1.3、 x i ≤ x < y x_i \leq x < y xi≤x<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} →∣y−xi∣−∣x−xi∣=∣y−x∣=y−x∣x−xi∣+∣y−x∣=∣y−xi∣AND∣y−x∣=y−x
解释一下上面这么写的原因,如: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 xi≤x)。。我们有:
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=1∑nwi(∣y−xi∣−∣x−xi∣)≥x<xi∑wi(x−y)+x≥xi∑wi(y−x)=(y−x)(x≥xi∑wi−x<xi∑wi)
结合 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<x∑wi<1/2implies和xi>x∑wi∴x≥xi∑wi−x<xi∑wixi≤x∑wi≥1/2≤1/2≥0
又 ∵ y − x > 0 \because y-x >0 ∵y−x>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| ∣y−xi∣−∣x−xi∣分为下面三种情况:
2.1、 x i ≤ y < x x_i \leq y < x xi≤y<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} →∣y−xi∣−∣x−xi∣=−∣x−y∣=y−x∣y−xi∣+∣x−y∣=∣x−xi∣AND∣x−y∣=x−y
2.2、 y ≤ x i < x y \leq x_i < x y≤xi<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} →∣y−xi∣−∣x−xi∣≥−(x−y)=y−x∣y−xi≥0∣AND∣x−xi∣≤x−y
2.3、 y < x ≤ x i y < x \leq x_i y<x≤xi,类似情况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} →∣y−xi∣−∣x−xi∣=∣x−y∣=x−y∣x−y∣+∣x−xi∣=∣y−xi∣AND∣x−y∣=x−y
和之前处理一样,分为前两种情况为 x i < x x_i < x xi<x,第三种情况为 x ≤ x i x \leq x_i x≤xi,我们有:
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=1∑nwi(∣y−xi∣−∣x−xi∣)≥xi<x∑wi(y−x)+x≤xi∑wi(x−y)=(y−x)(xi<x∑wi−x≤xi∑wi)
同上, ∵ 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<x∑wi和xi>x∑wi≤1/2∴xi<x∑wi−x≤xi∑wi<1/2impliesxi≥x∑wi>1/2>0
又 ∵ y − x > 0 ∴ f ( y ) − f ( x ) > 0 \because y-x>0 \therefore f(y)-f(x)>0 ∵y−x>0∴f(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是一维邮局问题的最优解,得证。
我们采用一对坐标来表示每个点 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=1∑nwi(∣x−xi∣+∣y−yi∣)
我们可以将函数 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=1∑nwi∣x−xi∣=i=1∑nwi∣y−yi∣
我们要使 f ( x , y ) f(x,y) f(x,y)取得最小值,可以单独的对每一维度进行处理,因为 g ( x ) g(x) g(x)不依赖于变量 y , h ( y ) y,h(y) y,h(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 x、y维度上的带权中位数,设为 x k , y k x_k,y_k xk,yk。最终答案记为 ( x k , y k ) (x_k,y_k) (xk,yk)。