如何用JS通过距离函数结合二分查找定位3D秘密点?
3D秘密点定位问题的正确实现方案
已实现的欧氏距离计算函数
你提供的距离计算函数逻辑正确,可直接使用:
const secretPoint = [12, 45, 99]; export default function getDistance(manualPoint) { if (manualPoint.length !== 3) { console.error("Wrong manualPoint!"); } let sum = 0; for (let i = 0; i < manualPoint.length; i++) { const difference = secretPoint[i] - manualPoint[i]; sum += Math.pow(difference, 2); } const result = Math.sqrt(sum); return result; }
原二分查找的错误分析
你的单维度二分查找逻辑存在核心问题:通过比较left和right位置的距离调整边界,无法正确追踪距离的最小值点(即秘密点坐标)。固定另外两个维度时,距离随当前维度坐标的变化是开口向上的抛物线,最小值恰好对应秘密点坐标,原逻辑的比较方式无法收敛到这个最小值位置。
正确的单维度二分查找实现
针对单个维度(如Z轴),正确逻辑是比较中间位置mid和mid+1的距离,通过距离变化方向判断最小值所在区间:
- 如果
mid处的距离大于mid+1处的距离,说明秘密点坐标在mid+1到right之间,将左边界移至mid+1 - 反之,秘密点坐标在
left到mid之间,将右边界移至mid
重复此过程直到left === right,此时的left就是目标维度的坐标:
// fixedPoint:另外两个维度的固定值,比如找Z轴时传入[x, y, 0](初始x,y可设为0) // dim:要查找的维度索引(0=X,1=Y,2=Z) function findSingleDimension(fixedPoint, dim) { let left = 0; let right = 100; while (left < right) { const mid = Math.floor((left + right) / 2); // 构造mid和mid+1对应的测试点 const pointMid = [...fixedPoint]; pointMid[dim] = mid; const pointMid1 = [...fixedPoint]; pointMid1[dim] = mid + 1; const distMid = getDistance(pointMid); const distMid1 = getDistance(pointMid1); if (distMid > distMid1) { left = mid + 1; } else { right = mid; } } return left; }
三维秘密点的完整查找实现
对X、Y、Z三个维度依次调用上述函数,每次用已找到的维度值固定另外两个维度,确保调用次数最少:
function findSecretPoint() { // 1. 查找X轴,固定Y、Z为0 const x = findSingleDimension([0, 0, 0], 0); // 2. 查找Y轴,固定X为已找到值,Z为0 const y = findSingleDimension([x, 0, 0], 1); // 3. 查找Z轴,固定X、Y为已找到值 const z = findSingleDimension([x, y, 0], 2); return [x, y, z]; } // 测试 console.log(findSecretPoint()); // 针对[12,45,99]或[12,45,28]都能输出正确结果
调用次数说明
每个维度的可能值为0-100(共101个),二分查找的时间复杂度为O(log₂101)≈7次调用/维度,三个维度总共最多21次调用,完全符合“最少调用次数”的要求。
内容的提问来源于stack exchange,提问作者tresor13
相关产品推荐
相关产品推荐

