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

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

相关推荐
xieliyu.6 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
一条小锦吕*6 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
如竟没有火炬8 小时前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
8Qi88 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
绿算技术8 小时前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构
Qt程序员9 小时前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu
想吃火锅10059 小时前
【leetcode】1.两数之和js版
javascript·算法·leetcode
qeen879 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
net3m3310 小时前
一阶软件低通滤波器算法
人工智能·算法