9-2 (带权中位数)对分别具体以正权重$w_1,w_2,\dotsb,w_n$,且满足$\sum_{i=1}^{n}{w_i=1}$的$n$个互异的元素$x_1,x_2,\dotsb,x_n$来说,带权中位数$x_k$(较小中位数)是满足如下条件的元素:
例如,如果元素是$0.1 ,0.35 ,0.05 ,0.1 ,0.15 ,0.05 ,0.2$,并且每个元素的权重等于本身(即对所有$i=1,2,\dotsb,7都有w_i=x_i$),那么中位数是0.1,而带全中位数是0.2。
a. 证明:如果对所有$i=1,2,\dotsb,n$都有$w_i=1/n$,那么$x_1,x_2,\dotsb,x_n$的中位数就是$x_i$的带权中位数。
证明:$x_i,x_2,\dotsb,n$的中位数(题目给的是低中位数)是$x_k=x$那么就有:
这里解释下:
第1个式子是小于中位数的个数,因为是低中位数,无论集合是奇数偶数个都是小于$n/2$;
第2个式子是大于中位数的个数,当集合个数是奇数是,也是小于$n/2$,当集合个数为偶数时,等号成立。
同时因为每一个元素的权值都是置为$1/n$,那么就有:
满足带权中位数的第一个条件。同理,我们有:
第二个条件得证。因此当集合X的每个元素的权重都是$1/n$时,$x_1,x_2,\dotsb,x_n$的中位数$x_k=x$,同时也是带权中位数。
b. 利用排序,设计一个最坏情况下$O(nlgn)$时间的算法,可以得到$n$个元素的带权中位数。
Step1、可以对元素$x_1,x_2,\dotsb,x_n$采用归并排序或者堆排序算法来升序排序。
Step2、然后从最小$x_1$开始,从左往右遍历每一个,将权值累加起来,当权值超过$1/2$,那么最后一个导致超过$1/2$的元素就是带权中位数。
Step1时间复杂度为$O(nlgn)$,Step2时间复杂度为$O(n)$。满足题目要求。
c. 说明如何利用像9.3节的SELECT这样的线性时间中位数算法,在$\Theta(n)$最坏情况时间内求出带权中位数。
线性时间查找带权中位数的思想是二分查找。算法工作流程如下:
1、问题规模$n \leq 2$,可以在$O(1)$情况下暴力解决。
2、问题规模$n > 2$时,我们先找到集合$X$的中位数$x_k =x$,将集合$X$用$x_k$划分为两个集合,下面称为$L=\{x_i|1 \leq i \leq n,x_i < x\}$和$G=\{x_i|1 \leq i \leq n,x_i >x\}$,然后计算$W_L$和$W_G$(两部分的权重)。根据$W_G$和$W_G$的权重情况,可以分为3种情况处理:
在处理b、c情况时,我们为了避免下一次划分时重复计算$W_L$和$W_G$,对于情况b:我们可以将$w_k=w_k+W_G$,然后将$x_k$加入下一步要进行查找的集合$L$中。
下面时该算法的伪代码:
1 | WEIGHTED-MEDIUM(X) |
算法分析:在对数组的每一次递归过程中,取中位数$x_k$,划分集合X和计算$W_L,W_R$的时间复杂度均为$O(n)$。最差情况下满足以下递归式:
下一次递归,划分的集合是原来的一半元素,同时还有$x_k$,因此为$T(2n+1)$。
这个递归式和快速选择(线性选择算法)的递推式接近,该算法的时间复杂度$T(n)=\Theta(n)$。
邮局位置问题的定义如下,给定权重分别为$w_1,w_2,\dotsb,w_n$的$n$个点$p_1,p_2,\dotsb,p_n$,我们希望找到一个点$p$(不一定是输入点中的一个),使得$\sum_{i=1}^{n}{w_id(p,p_i)}$最小,这里$d(a,b)$表示点$a$和$b$之间的距离。
d. 证明:对一维邮局位置问题,带权中位数是最好的解决方法,其中,每个点都是一个实数,点$a$和$b$之间的距离是$d(a,b)=|a-b|$。
采用$x_1,x_2,\dotsb,x_n$表示$n$个点的坐标,每个点相应的权值为$w_1,w_2,\dotsb,w_n$,令$x=x_k$为带权中位数。
对于任意点$p$,我们设函数$f(p)=\sum_{i=1}^n{w_i|p-x_i|}$,我们需要找出令该函数最小值的点。令$y$是除$x$外的任意点,我们通过证明$f(y)-f(x) \geq 0$来检验带权中位数$x$是最优解。我们可以分为下面两种情况来讨论:$y > x$和 $x > y$。对于$\forall x,y$有:
1、 当$y>x$时,对于上面式子中的$|y-x_i|-|x-x_i|$可以分为三种情况:
1.1、$x < y \leq x_i$
1.2、$x < x_i \leq y$
1.3、$x_i \leq x < y$,类似1.1
解释一下上面这么写的原因,如:1.1,$d(x,x_i)==d(x,y)+d(y,x_i)$,绝对值内的减法理解为距离计算,配凑出与我们要求的式子,进行等价转换,后面方便处理。
其实对于1.1和1.3我们简单根据正负情况消去绝对值符号也行。
将前两种情况($x < x_i$)与第三种情况分开($x_i \leq x$)。。我们有:
结合$x_k$的性质,我们有:
又$\because y-x >0$,$\therefore f(y)-f(x) \geq 0$
2、当$x > y$时,我们同样将$|y-x_i|-|x-x_i|$分为下面三种情况:
2.1、$x_i \leq y < x$
2.2、$y \leq x_i < x$
2.3、$y < x \leq x_i$,类似情况1
和之前处理一样,分为前两种情况为$x_i < x$,第三种情况为$x \leq x_i$,我们有:
同上,$\because x$是带权中位数,有:
又 $\because y-x>0 \therefore f(y)-f(x)>0$。
综上:
因此,带权中位数$x=x_k$是一维邮局问题的最优解,得证。
e. 请给出二位邮局位置问题的最好解决方法:其中的点是$(x,y)$的二位坐标形式,点$a=(x_1,y_1)$与$b=(x_2,y_2)$之间的距离是$Manhattan$距离(曼哈顿距离/出租车距离/街区距离),即$d(a,b)=|x_1-x_2|+|y_1-y_2|$
我们采用一对坐标来表示每个点$p_i=(x_i,y_i)$,同时每个点相应的权值为$w_i$。因此,我们的目标转变为找到一个点$p=(x,y)$使下面的函数达到最小值:
我们可以将函数$f(x,y)$转变为两个等价的一元函数相加:
我们要使$f(x,y)$取得最小值,可以单独的对每一维度进行处理,因为$g(x)$不依赖于变量$y,h(y)$不依赖于变量$x$。因此:
原先的二维问题,现在问题就转变为求2个一维最优解问题。和我们上面问题$d$一样,因此,我们只要分别求$x、y$维度上的带权中位数,设为$x_k,y_k$。最终答案记为$(x_k,y_k)$。