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

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博客

相关推荐
黄敬峰2 小时前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术3 小时前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六7 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术7 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize8 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考1 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode