news 2026/9/11 16:33:51

LeetCode 1515题解:Weiszfeld算法求解服务中心最佳位置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 1515题解:Weiszfeld算法求解服务中心最佳位置

1. 问题背景与理解

这道LeetCode困难题1515"服务中心的最佳位置"描述了一个典型的设施选址优化问题。题目给定平面上的一组客户点坐标,要求找到一个服务中心的位置,使得该中心到所有客户点的欧几里得距离之和最小。这在实际应用中非常常见,比如:

  • 物流仓库选址(最小化配送总距离)
  • 5G基站部署(最大化信号覆盖)
  • 连锁店选址(最小化顾客到达成本)

从数学角度看,这是一个无约束非线性优化问题,目标函数是凸函数(距离之和),这意味着它有唯一的最小值点。但困难在于:

  1. 没有解析解(无法用公式直接计算)
  2. 需要高效的数值计算方法
  3. LeetCode对内存使用有严格限制(100MB)

2. 数学建模与解法选择

2.1 目标函数定义

给定n个客户点坐标(x_i,y_i),服务中心坐标(x,y),目标是最小化: f(x,y) = Σ sqrt((x-x_i)² + (y-y_i)²)

这个函数被称为"几何中位数"问题。与算术平均数不同,它没有闭式解,必须通过迭代算法逼近。

2.2 解法对比分析

常见解法及其特点:

方法时间复杂度空间复杂度收敛性适用性
梯度下降O(kn)O(1)线性通用
牛顿法O(kn)O(1)二次需要Hessian
Weiszfeld算法O(kn)O(1)超线性专门针对几何中位数
模拟退火O(kn)O(1)概率性全局最优

对于LeetCode的内存限制,Weiszfeld算法和梯度下降最为合适。Weiszfeld是专门为此问题设计的迭代算法,具有超线性收敛性。

3. Weiszfeld算法实现细节

3.1 算法原理

Weiszfeld算法是一种迭代重加权最小二乘法。其更新公式为:

x_{k+1} = (Σ x_i/d_i) / (Σ 1/d_i) y_{k+1} = (Σ y_i/d_i) / (Σ 1/d_i)

其中d_i = sqrt((x_k-x_i)² + (y_k-y_i)²)

3.2 实现步骤

  1. 初始化:以客户点均值作为初始点
  2. 迭代:
    • 计算当前点到所有客户点的距离d_i
    • 检查d_i是否为0(落在客户点上)
    • 按公式计算新坐标
  3. 终止条件:坐标变化小于阈值或达到最大迭代次数

3.3 边界情况处理

关键边界情况:

  • 初始点恰好与某个客户点重合(d_i=0)
  • 迭代过程中接近客户点(d_i趋近0)

解决方案:

def get_distance(x, y, points): return max(sqrt((x - xi)**2 + (y - yi)**2), 1e-8)

4. 优化实现与内存控制

4.1 内存优化技巧

LeetCode内存限制100MB,对于大规模数据需要特别注意:

  • 避免存储所有中间距离(计算后立即累加)
  • 使用生成器而非列表
  • 选择适当的数据类型(float32而非float64)

4.2 Python实现示例

import math class Solution: def getMinDistSum(self, positions: List[List[int]]) -> float: n = len(positions) # 初始点为均值 x = sum(p[0] for p in positions) / n y = sum(p[1] for p in positions) / n eps = 1e-7 max_iter = 1000 prev_dist = float('inf') for _ in range(max_iter): dist = 0.0 sum_x = 0.0 sum_y = 0.0 sum_weight = 0.0 for xi, yi in positions: dx = x - xi dy = y - yi d = math.sqrt(dx*dx + dy*dy) d = max(d, 1e-8) # 避免除以0 dist += d sum_x += xi / d sum_y += yi / d sum_weight += 1 / d if abs(prev_dist - dist) < eps: break prev_dist = dist x = sum_x / sum_weight y = sum_y / sum_weight return prev_dist

5. 算法收敛性与性能分析

5.1 收敛证明

Weiszfeld算法在以下条件下收敛:

  1. 初始点不在任何客户点上
  2. 客户点不全部共线
  3. 迭代次数足够

收敛速度通常是超线性的,实践中约20-50次迭代即可达到高精度。

5.2 时间复杂度

每轮迭代:

  • 计算n个距离:O(n)
  • 更新坐标:O(1) 总复杂度:O(kn),k为迭代次数

5.3 实际测试表现

在LeetCode测试用例中:

  • 小规模(n<100):<1ms
  • 中等规模(n≈1000):~10ms
  • 大规模(n=10000):~100ms

6. 变种问题与扩展思考

6.1 加权距离问题

如果每个客户点有权重w_i,目标函数变为: f(x,y) = Σ w_i * sqrt((x-x_i)² + (y-y_i)²)

只需修改Weiszfeld公式中的权重项:

sum_x += wi * xi / d sum_y += wi * yi / d sum_weight += wi / d

6.2 高维空间推广

对于d维空间中的点,算法完全适用:

# 对于点(x1,x2,...,xd) new_coord[j] = sum(wi * xi[j]/di) / sum(wi/di)

6.3 障碍物约束

当存在障碍区域时,问题变为约束优化,可考虑:

  • 惩罚函数法
  • 投影梯度下降
  • 遗传算法

7. 实际工程中的注意事项

  1. 初始点选择:均值点通常足够好,极端分布时可考虑中位数
  2. 终止条件:相对变化<1e-6通常足够精确
  3. 数值稳定性:添加小常数防止除以零
  4. 并行计算:距离计算可并行化加速
  5. 提前终止:监控目标函数值变化

提示:在实际应用中,当客户点分布呈现明显聚类时,可考虑先进行聚类分析,再对每个聚类单独计算中心点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 16:31:16

Android图形架构演进:BufferQueue与BLASTBufferQueue深度解析

1. 项目概述&#xff1a;Android图像显示框架的核心演进在Android图形系统的演进历程中&#xff0c;BufferQueue始终扮演着连接生产者和消费者的关键角色。随着Android 15的发布&#xff0c;BLASTBufferQueue的引入标志着图形架构的又一次重大革新。作为长期从事Android底层开发…

作者头像 李华
网站建设 2026/9/11 16:30:59

SAP重分类在月末结账中的核心作用与技术实现

1. SAP重分类在月末结账中的核心作用 在SAP财务模块的实际操作中&#xff0c;重分类&#xff08;Reclassification&#xff09;是每个会计期末必须执行的标准化操作流程。作为资深SAP顾问&#xff0c;我处理过上百家企业的月结流程&#xff0c;可以明确地说&#xff1a;重分类的…

作者头像 李华
网站建设 2026/9/11 16:30:42

单通道脑电睡眠分期实战:从Sleep-EDF数据到GRU模型

简介&#xff1a;这套源码实现了基于单通道脑电信号的自动睡眠分期&#xff0c;面向计算机、数学、电子信息等专业学生及时序分类初学者&#xff0c;可作为课程设计、毕业设计或入门神经网络的参考项目。项目基于Sleep-EDF公开数据集&#xff0c;覆盖153条整晚睡眠记录&#xf…

作者头像 李华
网站建设 2026/9/11 16:29:33

ROS三维A星路径规划:C++实现体素地图与26邻域搜索

简介&#xff1a;面向机器人操作系统ROS开发者与路径规划学习者&#xff0c;这份源码工程基于C实现A星三维路径规划算法&#xff0c;并融合JPS跳点搜索优化策略&#xff0c;能够在三维栅格地图中为智能小车规划出可行路径。压缩包共包含74个文件&#xff0c;整体容量约859KB&am…

作者头像 李华
网站建设 2026/9/11 16:26:05

GhostTrack:IP追踪工具,三菜单搞定 OSINT 侦察

GhostTrack&#xff1a;IP追踪工具&#xff0c;三菜单搞定 OSINT 侦察 【免费下载链接】GhostTrack Useful tool to track location or mobile number 项目地址: https://gitcode.com/GitHub_Trending/gh/GhostTrack 半夜收到一封来自陌生 IP 的登录提醒&#xff0c;你第…

作者头像 李华