华为秋招机试:最小覆盖圆算法与三分搜索实践

发布时间:2026/8/21 6:40:03

华为秋招机试:最小覆盖圆算法与三分搜索实践
1. 题目解析与需求拆解这道华为秋招机试题的核心是在二维平面上给定若干信号塔的坐标要求找到一个点使得该点到所有信号塔的最大距离最小化。换句话说我们需要在所有可能的点中找到一个位置使得离它最远的那个信号塔的距离尽可能小。这个问题在数学上被称为最小覆盖圆问题或者更准确地说是寻找一组点的最小外接圆。在实际工程应用中这相当于为多个信号塔寻找一个最优的中继站位置确保信号传输的最坏情况即最远距离被最小化。2. 算法思路分析2.1 暴力解法与复杂度分析最直观的解法是枚举所有可能的点计算每个点到所有信号塔的距离然后找出其中的最小值。然而平面上有无限多个点这种暴力解法显然不可行。即使我们只考虑信号塔之间的中点因为最优解很可能出现在这些位置对于n个信号塔需要考虑的组合数为O(n³)当n较大时题目中提到n≤1000这样的复杂度仍然难以接受。2.2 几何解法最小覆盖圆在计算几何中寻找一组点的最小覆盖圆有成熟的算法。最著名的是Welzl算法这是一种随机增量算法平均时间复杂度为O(n)。Welzl算法的基本思想是随机打乱所有点的顺序初始时圆为空对于每个点如果它不在当前圆内则将它作为边界点递归地计算其他点的最小覆盖圆这个算法在实践中表现良好但实现起来有一定难度特别是在处理边界条件时。2.3 数值解法三分搜索考虑到本题是在二维平面上寻找最优解我们可以采用数值优化的方法。具体来说可以分别在x轴和y轴方向上进行三分搜索。三分搜索的基本思路确定搜索范围所有信号塔的最小/最大x、y坐标在x方向上进行三分对每个x值在y方向上进行三分搜索对于每个(x,y)点计算到所有信号塔的最大距离不断缩小搜索范围直到达到精度要求这种方法的时间复杂度为O(n log(1/ε))其中ε是要求的精度对于题目中的精度要求1e-6来说非常合适。3. 代码实现与解析3.1 Java实现import java.util.*; public class Main { static class Point { double x, y; Point(double x, double y) { this.x x; this.y y; } } static Point[] points; static int n; public static void main(String[] args) { Scanner sc new Scanner(System.in); n sc.nextInt(); points new Point[n]; double minX Double.MAX_VALUE, maxX Double.MIN_VALUE; double minY Double.MAX_VALUE, maxY Double.MIN_VALUE; for (int i 0; i n; i) { double x sc.nextDouble(); double y sc.nextDouble(); points[i] new Point(x, y); minX Math.min(minX, x); maxX Math.max(maxX, x); minY Math.min(minY, y); maxY Math.max(maxY, y); } // 三分搜索 double lx minX, rx maxX; double ly minY, ry maxY; double res Double.MAX_VALUE; while (rx - lx 1e-7 || ry - ly 1e-7) { double mid1x lx (rx - lx) / 3; double mid2x rx - (rx - lx) / 3; double[] res1 ternarySearchY(mid1x, ly, ry); double[] res2 ternarySearchY(mid2x, ly, ry); if (res1[0] res2[0]) { rx mid2x; res Math.min(res, res1[0]); } else { lx mid1x; res Math.min(res, res2[0]); } } System.out.printf(%.6f\n, res); } static double[] ternarySearchY(double x, double ly, double ry) { double res Double.MAX_VALUE; double bestY 0; while (ry - ly 1e-7) { double mid1y ly (ry - ly) / 3; double mid2y ry - (ry - ly) / 3; double d1 maxDistance(x, mid1y); double d2 maxDistance(x, mid2y); if (d1 d2) { ry mid2y; res Math.min(res, d1); bestY mid1y; } else { ly mid1y; res Math.min(res, d2); bestY mid2y; } } return new double[]{res, bestY}; } static double maxDistance(double x, double y) { double max 0; for (Point p : points) { double dx x - p.x; double dy y - p.y; double dist Math.sqrt(dx * dx dy * dy); max Math.max(max, dist); } return max; } }3.2 C实现#include iostream #include vector #include cmath #include iomanip #include algorithm using namespace std; struct Point { double x, y; }; vectorPoint points; int n; double max_distance(double x, double y) { double max_dist 0; for (const auto p : points) { double dx x - p.x; double dy y - p.y; double dist sqrt(dx * dx dy * dy); max_dist max(max_dist, dist); } return max_dist; } pairdouble, double ternary_search_y(double x, double ly, double ry) { double res 1e18; double best_y 0; while (ry - ly 1e-7) { double mid1y ly (ry - ly) / 3; double mid2y ry - (ry - ly) / 3; double d1 max_distance(x, mid1y); double d2 max_distance(x, mid2y); if (d1 d2) { ry mid2y; res min(res, d1); best_y mid1y; } else { ly mid1y; res min(res, d2); best_y mid2y; } } return {res, best_y}; } int main() { cin n; points.resize(n); double min_x 1e18, max_x -1e18; double min_y 1e18, max_y -1e18; for (int i 0; i n; i) { cin points[i].x points[i].y; min_x min(min_x, points[i].x); max_x max(max_x, points[i].x); min_y min(min_y, points[i].y); max_y max(max_y, points[i].y); } double lx min_x, rx max_x; double ly min_y, ry max_y; double res 1e18; while (rx - lx 1e-7 || ry - ly 1e-7) { double mid1x lx (rx - lx) / 3; double mid2x rx - (rx - lx) / 3; auto [res1, y1] ternary_search_y(mid1x, ly, ry); auto [res2, y2] ternary_search_y(mid2x, ly, ry); if (res1 res2) { rx mid2x; res min(res, res1); } else { lx mid1x; res min(res, res2); } } cout fixed setprecision(6) res endl; return 0; }3.3 Python实现import math def main(): import sys input sys.stdin.read data input().split() idx 0 n int(data[idx]) idx 1 points [] min_x float(inf) max_x -float(inf) min_y float(inf) max_y -float(inf) for _ in range(n): x float(data[idx]) y float(data[idx1]) idx 2 points.append((x, y)) min_x min(min_x, x) max_x max(max_x, x) min_y min(min_y, y) max_y max(max_y, y) def max_distance(x, y): max_dist 0 for px, py in points: dx x - px dy y - py dist math.sqrt(dx*dx dy*dy) max_dist max(max_dist, dist) return max_dist def ternary_search_y(x, ly, ry): res float(inf) best_y 0 while ry - ly 1e-7: mid1y ly (ry - ly) / 3 mid2y ry - (ry - ly) / 3 d1 max_distance(x, mid1y) d2 max_distance(x, mid2y) if d1 d2: ry mid2y res min(res, d1) best_y mid1y else: ly mid1y res min(res, d2) best_y mid2y return res, best_y lx, rx min_x, max_x ly, ry min_y, max_y res float(inf) while rx - lx 1e-7 or ry - ly 1e-7: mid1x lx (rx - lx) / 3 mid2x rx - (rx - lx) / 3 res1, y1 ternary_search_y(mid1x, ly, ry) res2, y2 ternary_search_y(mid2x, ly, ry) if res1 res2: rx mid2x res min(res, res1) else: lx mid1x res min(res, res2) print({0:.6f}.format(res)) if __name__ __main__: main()4. 算法优化与边界处理4.1 精度控制与终止条件在三分搜索中我们需要特别注意终止条件。对于本题要求输出结果精确到小数点后6位因此我们的搜索精度应该更高通常设为1e-7或1e-8。在实现中我们同时对x和y方向进行三分搜索因此需要确保两个方向的搜索都达到精度要求while (rx - lx 1e-7 || ry - ly 1e-7) { // 三分搜索过程 }4.2 避免重复计算计算点到所有信号塔的最大距离是一个O(n)的操作在三分搜索中会被频繁调用。我们可以通过以下方式优化将信号塔坐标存储在数组中避免重复访问复杂数据结构在Java/C中使用基本类型而非对象减少访问开销在Python中使用元组而非类来存储点坐标4.3 特殊情况处理需要考虑的特殊情况包括只有一个信号塔最小距离显然为0所有信号塔在同一直线上算法仍然适用浮点数精度问题确保使用double而非float5. 复杂度分析与性能比较5.1 时间复杂度三分搜索的时间复杂度取决于搜索范围和精度要求。假设初始搜索范围为D精度要求为ε则迭代次数为O(log(D/ε))。每次迭代需要O(n)的时间计算最大距离。因此总时间复杂度为O(n log(D/ε))。对于n≤1000和ε1e-7的情况这个复杂度是完全可接受的。5.2 空间复杂度我们只需要O(n)的空间存储信号塔坐标因此空间复杂度为O(n)。5.3 与其他算法的比较Welzl算法虽然理论复杂度更好O(n)但实现复杂常数因子大在实际中对于n1000可能不如三分搜索快。梯度下降另一种数值优化方法但需要调整学习率可能收敛到局部最优。模拟退火随机优化方法适用于更复杂的问题但本题有更高效的确定性算法。6. 实际应用与扩展6.1 在通信网络中的应用这个问题在实际通信网络规划中有重要应用。例如基站选址确保覆盖区域内所有用户的最差信号质量尽可能好无线传感器网络选择数据汇聚点的最优位置无人机基站部署寻找最佳悬停位置覆盖多个地面终端6.2 问题变种与扩展加权最小覆盖圆每个信号塔有不同的权重需要考虑加权距离障碍物约束在存在障碍物的情况下寻找最优位置动态场景信号塔位置随时间变化需要动态调整最优位置高维空间将问题扩展到三维或更高维空间6.3 在线测试与验证在实现这类算法时建议使用以下测试用例进行验证少量点2-3个的简单情况所有点共线的情况随机生成的大规模数据边界值如坐标非常大或非常小例如可以使用如下Python代码生成测试用例import random def generate_test_case(n): print(n) for _ in range(n): x random.uniform(-1e6, 1e6) y random.uniform(-1e6, 1e6) print(f{x:.6f} {y:.6f}) generate_test_case(1000)7. 面试技巧与注意事项7.1 解题思路阐述在面试中遇到此类问题时建议按以下步骤阐述明确问题重述问题确保理解正确分析暴力解法说明其不可行性提出优化思路几何性质或数学优化方法讨论算法选择比较不同方法的优缺点考虑边界情况特殊输入的处理分析复杂度时间和空间复杂度7.2 代码实现建议模块化设计将关键操作如距离计算封装为函数良好的命名使用有意义的变量名如min_x, max_y等注释关键步骤解释三分搜索的逻辑处理输入输出注意格式要求特别是精度7.3 常见错误与避免方法精度不足使用float而非double或终止条件不够严格解决方法始终使用double设置足够的精度余量无限循环终止条件设置不当解决方法确保同时检查x和y方向的收敛初始范围错误没有正确计算信号塔的边界解决方法先遍历所有点确定min_x, max_x等性能问题在内部循环中执行不必要的操作解决方法预先存储点坐标简化距离计算8. 总结与个人体会这道题目很好地考察了以下几个方面的能力将实际问题抽象为数学模型的能力对计算几何基本问题的了解数值优化算法的实现技巧边界条件和精度的处理在实际实现过程中我发现三分搜索虽然思路简单但要正确处理二维搜索并不容易。特别是在确定搜索范围和终止条件时需要仔细考虑。此外对于大规模数据n1000算法效率完全足够这验证了其在实际应用中的可行性。对于准备华为这类技术公司面试的求职者我的建议是熟练掌握基础算法如二分搜索、三分搜索等理解如何将实际问题转化为算法问题注意代码实现的细节和鲁棒性多练习在线编程题目适应机试环境最后这个问题还可以进一步优化比如结合梯度下降进行局部精细搜索或者并行化处理距离计算。这些优化在极端大规模数据下可能会有更明显的效果。

相关新闻

初中物理电路设计四步法:从逻辑抽象到规范绘图,攻克串并联与短路难题

初中物理电路设计四步法:从逻辑抽象到规范绘图,攻克串并联与短路难题

2026/8/21 6:40:03

初三物理电学,很多同学觉得电路图设计是“玄学”——题目一看就会,一画就废。明明知道要用开关控制灯泡,可一落笔,不是短路就是断路,或者画出来的电路根本实现不了题目要求的功能。这背后真正的问题,往往不…

DVM-HALL与NHAS:构建可信赖、可进化的自主商业智能体系统

DVM-HALL与NHAS:构建可信赖、可进化的自主商业智能体系统

2026/8/21 6:30:02

1. 项目概述:从概念到落地的商业智能新范式最近和几个做电商、内容平台以及智能客服系统的朋友聊天,大家普遍面临一个共同的“天花板”:智能体(Agent)用起来了,自动化流程也跑通了,但总感觉缺了…

量子安全构造范式:为智能体系统构建抗量子攻击的密码学基石

量子安全构造范式:为智能体系统构建抗量子攻击的密码学基石

2026/8/21 6:30:02

1. 从“后补”到“原生”:为什么我们需要量子安全构造范式最近和几个做AI Agent和隐私计算的朋友聊天,大家不约而同地提到了一个隐忧:我们现在花大力气构建的、号称“智能”和“安全”的Agent系统,其底层加密基石,可能…

6.3.2 ww_mutex —— 多锁场景下的死锁避免机制

6.3.2 ww_mutex —— 多锁场景下的死锁避免机制

2026/8/21 7:40:06

dma_resv 的核心是一把保护 BO 元数据(内存位置、fence 列表)的锁。但当一次操作需要同时锁定多个 BO 时,单纯的互斥锁将无法回避一类根本性的问题——加锁顺序死锁。本节剖析内核为此设计的 ww_mutex(wait/wound mutex&#xff0…

【AI项目落地】零花钱项目实战三M2(Java + IDEA +ClaudeCode + qwen + Spec-Driven Dev)

【AI项目落地】零花钱项目实战三M2(Java + IDEA +ClaudeCode + qwen + Spec-Driven Dev)

2026/8/21 7:40:06

零、AI项目实战目录 1、IDEA安装ClaudeCode,对接国产大模型 实操指导2、JAVA_AI人工智能项目实战–前置AI相关知识3、【AI项目落地】零花钱项目实战一(Java IDEA ClaudeCode qwen Spec-Driven Dev)4、【AI项目落地】零花钱项目实战二M1&am…

工业遥感新视角:遥感图像储罐实例分割数据集(含YOLOv11-seg实战)

工业遥感新视角:遥感图像储罐实例分割数据集(含YOLOv11-seg实战)

2026/8/21 7:40:06

工业遥感新视角:遥感图像储罐实例分割数据集(含YOLOv11-seg实战) 在能源管理与工业设施监控中,储罐、污水处理池等大型设施的精准识别与定期盘点至关重要。然而,依靠人工记录或现场巡查,效率低且难以覆盖大…

【FinAPI|04】企业 AI 财务管理,会经历哪三个阶段?

【FinAPI|04】企业 AI 财务管理,会经历哪三个阶段?

2026/8/21 7:40:06

企业第一次接入大模型时,最关心的是能不能用。过一段时间,各部门都开始调用AI,管理者便要弄清公司采购了多少模型、Key 在谁手里、每月花了多少钱。等账号和账单收拢以后,问题还会继续变化。费用为什么上涨,这些调用完…

Netty面试进阶:从原理到实战,突破Java后端高并发网络编程天花板

Netty面试进阶:从原理到实战,突破Java后端高并发网络编程天花板

2026/8/21 7:40:06

最近面试 Java 后端岗位,是不是感觉 Netty 相关的八股文背得滚瓜烂熟,但面试官一深入追问,或者让你结合项目聊点实际的,就有点卡壳了?“Netty 的线程模型是什么?”—— Reactor 主从多线程。 “零拷贝怎么实…

C++可变参数模板:从类型安全格式化到通用工厂模式实战

C++可变参数模板:从类型安全格式化到通用工厂模式实战

2026/8/21 7:30:05

1. 从“固定”到“无限”:可变参数模板的范式革命 在C98/03的时代,如果你要写一个函数来处理任意数量的参数,比如一个打印函数或者一个求和函数,你可能会感到束手束脚。要么写死参数个数,要么求助于C语言的可变参数宏&…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/19 3:36:59

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/20 21:07:35

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/19 8:02:16

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

091、主从同步控制策略

091、主从同步控制策略

2026/8/21 0:09:47

091、主从同步控制策略:从一次多轴抖动事故说起 去年调试一台四轴龙门平台,Z轴和两个X轴做主从同步。电机选的是台达A2系列,驱动器工作在位置模式,主站发脉冲指令,从站硬线跟随。调试时发现一个诡异现象:当主站以500rpm匀速运行时,从站电流波形每隔几秒会出现一次毛刺,…

向量检索实验失败后该查什么

向量检索实验失败后该查什么

2026/8/21 0:09:47

向量检索实验失败后该查什么 这篇要解决什么 向量检索实验失败后该查什么讨论的是一个可复查的工程问题。向量检索实验失败后该查什么不拿未经记录的事故、跑分或成本当作论据;判断需要回到当前项目的输入、版本和运行条件。 从边界开始 处理向量检索实验失败后该查…

提示词发布过程中的止损边界

提示词发布过程中的止损边界

2026/8/21 0:09:47

提示词发布过程中的止损边界 这篇要解决什么 提示词发布过程中的止损边界讨论的是一个可复查的工程问题。提示词发布过程中的止损边界不拿未经记录的事故、跑分或成本当作论据;判断需要回到当前项目的输入、版本和运行条件。 从边界开始 处理提示词发布过程中的止损…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/18 12:20:24

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…