1 中位数
中位数:将数组大小为n的数据,从大到小,或者是从小到大排列,那么当n为奇数的时候,中位数就是(n+1)/2的这个数,当n为偶数的时候,中位数就是n/2和(n+1)/2这二个数据的平均数。
中位数:也就是选取中间的数。一种衡量集中趋势的方法。
要找中位数,首先需要从小到大排序,例如这组数据:23、29、20、32、23、21、33、25;
我们将数据排序20、21、23、23、25、29、32、33;排序后发现有8个数怎么办?
若有n个数,则选择第(n+1)/2个(当n为奇数),或选择(n/2+1)个(当n为偶数)
此例中选择25为中位数
2 带权中位数
带权中位数:首先也是将这个数组的数据按一定的顺序排列, 带权中位数(Weighted Median)对于n个互不相同的元素集合x1、x2……xn,其权重依次为w1、w2……wn。令W = sigma(wi),则带权中位数xk满足:(这里的权重可以用这个数据出现的频率来表示,或者这个数据的重要性)
sigma(wi)(xi<xk)<=W/2
sigma(wi)(xi>xk)<=W/2
其中sigma表示求和。
带权中位数满足:sigma(|xi-xk|*wi)最小
百度的证明:
D[I]为权重,DIST为距离
若最优点在T
则有:
∑
{D[I]*DIST(I,T)}(I<>T)<=∑
{D[I]*DIST(I,T+1)}(I<>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)
即:
∑
{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))进一步化简为:
∑
{D[L]*(DIST(L,T)-DIST[L,T+1])}(L<=T)<=∑
{D[R]*(DIST(R,T+1)-DIST(R,T))}(R>=T+1)∵
DIST(L,T)-DIST(L,T+1)=DIST(T,T+1)
DIST(R,T+1)-DIST(R,T)=DIST(T+1,T)
OBVIOUSLY : DIST(T,T+1)=DIST(T+1,T)
因此:
∑
D[L](L<=T)>=∑
(D[R])(R>=T+1)
即:∑
D[L](L<T)+D[T]>=∑
(D[R])(R>T)
因此我们发现,若
T是最优点,则必有其左边的权值和加上
D[T]后大于右边的权值和
而类似的,我们可以证明其右边的权值和加上
D[T]后大于左边的权值和
因此我们要找的点也就是满足以上条件的点。注意到此时我们的选择已经和具体的位置(坐标)没有关系了,而成为主要考虑因素的仅仅是各点上的权值。
因为左边的权值和数+
D[T]>=右边的权值和,那么:
LEFTSUM+D[T]>=
RIGHTSUM=
SUMALL-(LEFTSUM+D[T])
=>2*(LEFTSUM+D[T])>=
SUMALL
=>2*RIGHTSUM<=
SUMALL
同理可得:
RIGHTSUM+D[T]>=
LEFTSUM=
SUMALL-(RIGHTSUM+D[T])
=>2*(RIGHTSUM+D[T])>=
SUMALL
=>2*LEFTSUM<=
SUMALL
此时我们发现:
2*LEFTSUM<=
SUMALL 而
2*(LEFTSUM+D[T])>=
SUMALL
也即是说当前的位置
T上的数包含了第[(
SUMALL)/2]个数,由开篇的简述可知,这第[(
SUMALL)/2]个数,就是这个序列中的带权中位数。所以这一类问题,实质上就是带权中位数问题。
3 例题及变形
3.1 距离之和最小
X轴上有N个点,求X轴上一点使它到这N个点的距离之和最小,输出这个最小的距离之和。
Input
<span id="Showjim86_bnbbbsbl_s35"></span>第1行:点的数量N。(2 <= N <= 10000) 第2 - N + 1行:点的位置。(-10^9 <= P[i] <= 10^9)代码:根据就是中位数
- #include <iostream>
- #include <algorithm>
- using namespace std;
- int a[10010];