中位数定理:到所有点的距离之和最小的点就是中位数

1. 引言

有一个经典问题:在一条直线上有 n 个点(位置坐标已知),我们要选一个点 x,使得 x 到所有给定点的距离之和 最小。

直觉告诉我们,这个最优的 x 应该取在"中间"的位置,也就是这些点的中位数

这个结论就是中位数定理(Median Theorem),它在数学、算法、运筹学中有广泛应用,比如仓库选址、管道铺设、绝对值回归等。

本文将从直观理解、严格证明、算法实现三个角度介绍这个定理。


2. 定理的严谨表述

是 n 个实数,定义函数

则 f(x) 在 ​ 处取得最小值(若 n 为奇数,中位数唯一;若 n 为偶数,取中位数区间 内任意点均可达到最小值)。

简单说:到一组点的曼哈顿距离之和最小的点就是它们的中位数


3. 直观解释

假设你在一条公路上有 n 个朋友,你想找一个地点开派对,使得所有人走过来的总路程最少。

如果只有两个人,你选在他们之间的任何位置,总路程都是两点之间的距离,所以整个区间都是最优。

如果有三个人,中间那个人无论你选左边还是右边,只要离开中间点,就会让两个人的路程变远,一个人的路程变近,但净效果是变远。

因此,中位数的位置有"平衡"效应:左边点的个数和右边点的个数相等(或相差一个)。

用数学分析来看:

在 x 左侧的点越多,f(x) 的左侧导数负得越多,右侧导数正得越多。当左右两侧点数相等时,导数从负变正,达到极小值。


4. 数学证明(简单版)

对 f(x) 求导数(注意绝对值函数的导数符号):

其中 sgn(0) 可以取 [−1,1] 之间的任意值。

  • 当 x 小于所有 ​ 时,每个符号为 −1,导数 =−n。

  • 当 x 大于所有 时,每个符号为 +1,导数 =+n。

  • 当 x 从左向右穿过某个 ​ 时,导数增加2(因为一个符号从 −1 变成 +1)。

因此导数是一个单调不减 的阶梯函数,从负值逐步增加到正值。

当导数由负变正(或经过0)时,函数达到最小值。

意味着左侧的负数个数与右侧的正数个数平衡,即 比 x 小的点的个数 ≤ n/2,且比 x 大的点的个数 ≤ n/2,这恰好是中位数的定义。

严格的离散优化也可通过邻域法证明:从中位数点出发,移动一小步,距离和不会减少。


5. 算法实现:求最小距离和

给定数组 aa,先排序,取中位数,然后计算距离和。

cpp

复制代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

// 返回中位数(向下取整)
int median(vector<int>& nums) {
    sort(nums.begin(), nums.end());
    int n = nums.size();
    return nums[n / 2];   // 0-based,对偶数长度返回靠左的中位数
}

// 计算到中位数的距离和
long long minDistanceSum(vector<int>& nums) {
    sort(nums.begin(), nums.end());
    int mid = median(nums);
    long long sum = 0;
    for (int x : nums) {
        sum += abs(x - mid);
    }
    return sum;
}

int main() {
    vector<int> points = {1, 2, 3, 10, 100};
    cout << "中位数 = " << median(points) << endl;
    cout << "最小距离和 = " << minDistanceSum(points) << endl;
    return 0;
}

输出:

text

复制代码
中位数 = 3
最小距离和 = (|1-3| + |2-3| + |3-3| + |10-3| + |100-3|) = 2+1+0+7+97 = 107

6. 应用场景

  • 一维仓库选址:在直线公路上建一个仓库,使得到各个零售店的距离总和最小 → 选店址的中位数。

  • 绝对值回归 :最小化 的 b 时,可用中位数求解。

  • 数据流的中位数:动态维护中位数,用于实时求距离和。

  • 图像处理:一维中值滤波(去除椒盐噪声)。


7. 与均值(平均数)的区别

最优化目标 最优解 特点
最小化距离平方和 算术平均数 对异常值敏感
最小化距离绝对值和 中位数 对异常值鲁棒

例如数据 [1, 2, 3, 100]

  • 平均数 ≈ 26.5 → 离差和 ≈ (25.5+24.5+23.5+73.5)=147

  • 中位数(2或3)取3 → 离差和 = 2+1+0+97=100,更小且更稳健。


8. 扩展:二维?曼哈顿距离

若在二维平面上,求一点 到给定点集的曼哈顿距离之和最小:

由于可以分离变量,分别对 x 坐标取中位数,对 y 坐标取中位数 ,得到的点即为最优解。

这就是为什么曼哈顿距离下的设施选址问题可以分解成两个一维问题。

9.推荐

中位数定理-CSDN博客

相关推荐
nlpming1 小时前
opencode 上下文压缩(Compaction)机制
算法
anew___1 小时前
算法刷题避坑指南:从数据规模到易错点的实战总结
算法
HZY1618yzh1 小时前
洛谷题解:P16304 [蓝桥杯 2026 省 Java C 组] 抽奖活动
java·c++·算法·蓝桥杯
智者知已应修善业2 小时前
【51单片机从奇数始再转偶数逐一点亮并循环】2023-9-8
c++·经验分享·笔记·算法·51单片机
倔强的猴子(翻版)2 小时前
我用 Python 写了个排序库,一亿数据量下比 C 级 np.sort() 快 7 倍
人工智能·python·算法·阿里云·文心一言
郝学胜-神的一滴2 小时前
深入理解回归损失函数:MSE、L1 与 Smooth L1 的设计哲学
人工智能·python·程序人生·算法·机器学习·数据挖掘·回归
努力努力再努力wz2 小时前
【MySQL进阶系列】拒绝冗余SQL:带你透彻理解视图的底层逻辑
android·c语言·数据结构·数据库·c++·sql·mysql
iCxhust2 小时前
在 emu8086 中可以直接编译运行的完整汇编程序,演示数组的定义、遍历、求和、求最大值。
开发语言·前端·javascript·汇编·单片机·嵌入式硬件·算法
Jinkxs2 小时前
LoadBalancer- 常见负载均衡算法:轮询 / 加权轮询 / 最少连接等基础实现
运维·算法·负载均衡