十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

LeetCode 1515题解:Weiszfeld算法求解服务中心最佳位置 1. 问题背景与理解这道LeetCode困难题1515服务中心的最佳位置描述了一个典型的设施选址优化问题。题目给定平面上的一组客户点坐标要求找到一个服务中心的位置使得该中心到所有客户点的欧几里得距离之和最小。这在实际应用中非常常见比如物流仓库选址最小化配送总距离5G基站部署最大化信号覆盖连锁店选址最小化顾客到达成本从数学角度看这是一个无约束非线性优化问题目标函数是凸函数距离之和这意味着它有唯一的最小值点。但困难在于没有解析解无法用公式直接计算需要高效的数值计算方法LeetCode对内存使用有严格限制100MB2. 数学建模与解法选择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)二次需要HessianWeiszfeld算法O(kn)O(1)超线性专门针对几何中位数模拟退火O(kn)O(1)概率性全局最优对于LeetCode的内存限制Weiszfeld算法和梯度下降最为合适。Weiszfeld是专门为此问题设计的迭代算法具有超线性收敛性。3. Weiszfeld算法实现细节3.1 算法原理Weiszfeld算法是一种迭代重加权最小二乘法。其更新公式为x_{k1} (Σ x_i/d_i) / (Σ 1/d_i) y_{k1} (Σ y_i/d_i) / (Σ 1/d_i)其中d_i sqrt((x_k-x_i)² (y_k-y_i)²)3.2 实现步骤初始化以客户点均值作为初始点迭代计算当前点到所有客户点的距离d_i检查d_i是否为0落在客户点上按公式计算新坐标终止条件坐标变化小于阈值或达到最大迭代次数3.3 边界情况处理关键边界情况初始点恰好与某个客户点重合d_i0迭代过程中接近客户点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而非float644.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_dist5. 算法收敛性与性能分析5.1 收敛证明Weiszfeld算法在以下条件下收敛初始点不在任何客户点上客户点不全部共线迭代次数足够收敛速度通常是超线性的实践中约20-50次迭代即可达到高精度。5.2 时间复杂度每轮迭代计算n个距离O(n)更新坐标O(1) 总复杂度O(kn)k为迭代次数5.3 实际测试表现在LeetCode测试用例中小规模(n100)1ms中等规模(n≈1000)~10ms大规模(n10000)~100ms6. 变种问题与扩展思考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 / d6.2 高维空间推广对于d维空间中的点算法完全适用# 对于点(x1,x2,...,xd) new_coord[j] sum(wi * xi[j]/di) / sum(wi/di)6.3 障碍物约束当存在障碍区域时问题变为约束优化可考虑惩罚函数法投影梯度下降遗传算法7. 实际工程中的注意事项初始点选择均值点通常足够好极端分布时可考虑中位数终止条件相对变化1e-6通常足够精确数值稳定性添加小常数防止除以零并行计算距离计算可并行化加速提前终止监控目标函数值变化提示在实际应用中当客户点分布呈现明显聚类时可考虑先进行聚类分析再对每个聚类单独计算中心点。
返回列表