教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载欧几里得距离Euclidean distance是衡量两点之间直线距离的基础度量广泛用于几何运算、机器学习分类与聚类等场景。本文以 30 seconds of code 仓库中的 euclidean-distance.md 为主体系统讲解其数学定义、从 2D 到 N 维的 JavaScript 实现演进、Math.hypot()的底层原理与时间复杂度分析并展示该工具函数在仓库中 K 近邻、K-means 等算法里的实际应用让你拿到一份可直接复制运行的通用距离计算方案。定义从勾股定理到欧几里得距离欧几里得距离描述的是欧几里得空间中两点之间连接线段的长度。在二维平面上它恰好等于以两点坐标差为直角边所构成的直角三角形的斜边因此可以直接由勾股定理Pythagorean theorem导出。设平面上两点A(x1, y1)与B(x2, y2)令横纵坐标差为x x_2 - x_1\\ y y_2 - y_1则距离d满足d^2 x^2 y^2 \\ d^2 (x_2 - x_1)^2 (y_2 - y_1)^2 \\ d \sqrt{(x_2 - x_1)^2 (y_2 - y_1)^2}这一结论可以自然推广到三维乃至任意 N 维空间只需将各维度坐标差平方后求和再开平方根即可。原文档在 euclidean-distance.md 中以 LaTeX 表达式完整保留了这套推导是实现部分所有代码的理论基础。2D 实现一行代码的Math.hypot()在二维平面上JavaScript 内置的Math.hypot()方法可以直接完成“平方和再开方”的运算。原文档给出的核心实现只有一行const distance (x0, y0, x1, y1) Math.hypot(x1 - x0, y1 - y0); distance(1, 1, 2, 3); // ~2.2361将两个点拆成四个独立参数传入在函数体内分别求出x、y方向的差值再交给Math.hypot()求其平方和的平方根。对(1, 1)与(2, 3)x 1、y 2√(1 4) ≈ 2.2361结果与手工计算完全一致。为什么优先选择Math.hypot()从实现原理看Math.hypot(...values)会先计算所有参数的平方和再返回平方根等价于Math.sqrt(x*x y*y)。但与手写Math.sqrt()相比它有两点关键优势避免中间结果溢出或下溢当坐标差值非常大或非常小时x * x可能超出Number的表示范围约1.79e308或过小导致精度损失而Math.hypot()在内部采用缩放算法能更安全地处理极端数值表达更简洁Math.hypot(x1 - x0, y1 - y0)直接对应数学公式√(x² y²)可读性远优于手工拼接Math.sqrt()。3D 实现以数组表示点让维度可扩展当维度扩展到三维时公式形式不变只是增加一个坐标差项。为了让代码更具可读性原文档建议用数组表示每个点并借助**数组解构array destructuring**在参数位置直接取出各坐标分量const distance ([x0, y0, z0], [x1, y1, z1]) Math.hypot(x1 - x0, y1 - y0, z1 - z0); distance([1, 1, 1], [2, 3, 2]); // ~2.4495对(1, 1, 1)与(2, 3, 2)各维差值为1, 2, 1√(1 4 1) ≈ 2.4495。数组化的表示方式不仅消除了四个独立参数在维度增多时的冗长感也为下一节泛化到任意维度铺平了道路——同样的思路也出现在仓库的 midpoint.md 中计算中点时先解构取出坐标再逐维求均值并同样提供了 2D、3D、ND 三种递进写法二者互为参照。N 维通用实现Object.keys()map() 展开运算符欧几里得距离的定义对任意维度成立因此可以写出一个适用于任意长度坐标数组的通用函数。原文档给出的实现如下const euclideanDistance (a, b) Math.hypot(...Object.keys(a).map(k b[k] - a[k])); euclideanDistance([1, 1], [2, 3]); // ~2.2361 euclideanDistance([1, 1, 1], [2, 3, 2]); // ~2.4495 euclideanDistance([1, 1, 1, 1], [2, 3, 2, 3]); // ~3.1623其工作原理分三步Object.keys(a)取得点a的所有索引对数组即0, 1, 2, ...隐式声明了“维度集合以第一个点的键为准”Array.prototype.map(k b[k] - a[k])对每一维计算b与a的坐标差生成差值数组展开运算符...将差值数组逐项展开为Math.hypot()的参数完成平方和开方。三个验证用例覆盖了 2D、3D、4D 场景其中四维点(1,1,1,1)与(2,3,2,3)的差值为1, 2, 1, 2√(1414) ≈ 3.1623说明该函数确实做到了“维度无关”。这是本文推荐的生产可用版本也是仓库内 K 近邻、K-means 等算法实际复用的核心工具函数。时间复杂度O(n)的线性扫描原文档在 euclidean-distance.md 的 Complexity 一节明确指出通用实现的时间复杂度为O(n)其中n是点的维度数。这一结论的来源清晰可循Array.prototype.map()必须遍历n个维度逐一求差Object.keys()同样需要遍历键列表展开运算符与Math.hypot()的内部求和也各自为线性开销。因此在常数个维度如 2D、3D下距离计算的成本是固定的O(1)而在特征维度较高的场景例如机器学习中的高维特征向量每次距离计算的开销随维度线性增长设计算法时应对此有所预估。仓库实战印证K 近邻与 K-means 中的距离计算欧几里得距离是众多几何与机器学习算法的核心原语。在 30 seconds of code 仓库中该函数被明确收录于 geometry.yaml 集合与中点、向量夹角等同级列出并被两个经典算法直接引用k-nearest-neighbors.md分类时用Math.hypot(...Object.keys(el).map(key point[key] - el[key]))计算待分类点与每个样本点的欧几里得距离再按距离排序取前k个近邻并做多数投票其描述中直接以链接形式指向本文所讲的欧几里得距离k-means.md迭代聚类过程中用同样的Math.hypot()Object.keys()map()模式计算每个数据点到各聚类中心的距离再依据“最近中心”完成分配与质心重算同样在步骤说明中引用了欧几里得距离。此外仓库中的 vector-angle.md 也利用Math.hypot(...x)计算向量模长与夹角余弦公式配合求出两向量夹角——可见Math.hypot()是整个仓库几何计算家族中的通用基石。阅读源码对应文件为 content/snippets/js/s/k-nearest-neighbors.md、content/snippets/js/s/k-means.md、content/snippets/js/s/vector-angle.md可以清晰地看到这一工具函数在不同算法间的复用方式。使用建议与注意事项综合原文档与仓库实践在实际项目中使用欧几里得距离计算时建议遵循以下几点优先使用数组化接口将euclideanDistance(a, b)作为默认实现既能覆盖任意维度也便于与map()、reduce()等数组方法组合注意两数组维度一致性通用实现以a的键为准遍历若b长度不足b[k]会得到undefinedNaN将污染最终结果调用前应确保两个点维度相同极端数值场景信赖Math.hypot()涉及超大或超小坐标差时手写x * x y * y可能溢出或损失精度交给内置方法更稳妥评估维度开销对于高维数据如文本向量、图像特征O(n)的单次距离成本乘以样本量后可能相当可观必要时可引入降维或索引结构优化。至此从数学定义、逐维实现到复杂度分析再到仓库内算法实战你已经掌握了在 JavaScript 中计算任意维度欧几里得距离的完整方案可直接将euclideanDistance函数投入自己的几何或机器学习代码中。赞分享教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载相关推荐30 seconds of code用 JavaScript 与 Haversine 公式计算两个经纬度坐标间的距离30 seconds of code用 JavaScript 与 Haversine 公式计算两个经纬度坐标间的距离 导读 在定位、地理围栏、骑行/打车类应教程文档Milvus相似度计算余弦、欧几里得等距离度量比较Milvus相似度计算余弦、欧几里得等距离度量比较 在向量数据库Vector Database应用中相似度计算是核心功能之一。Milvus作为云原生向量数据库向量数据库分布式数据库后端30-seconds-of-code 实战用一行 JavaScript 代码计算任意月份的天数30 seconds of code 实战用一行 JavaScript 代码计算任意月份的天数 导读 在 JavaScript 中处理日期向来不算直观但计教程文档上一篇F´ Subtopology 开发指南手写子拓扑并集成进主部署F Prime下一篇Rust 模式匹配进阶掌握 |、..、、匹配守卫与 .. 忽略语法Rust By Practice 实战解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考