繁体   English   中英

找到距离原点最近的K点(0,0)

[英]Find the K closest points to the origin (0, 0)

问题是,给定坐标列表,确定最接近原点的k坐标的数量。

我已经能够确定点和原点之间的距离,但是当过滤最近的k点时,我迷路了。 我决定将这个逻辑放在第二个for循环中,对距离最近到最远的数组进行排序,然后推送小于K的值。

 function kClosest(points, k) { let length = []; let arr = []; let result = []; let a = 0; let b = 0; for (let i = 0; i < points.length; i++) { a = points[i][0]; //x coord b = points[i][1]; //y coord (y will always be second number or '1') length.push(parseFloat(calcHypotenuse(a, b).toFixed(4))) arr.push([points[i], length[i]]) } function calcHypotenuse(a, b) { return (Math.sqrt((a * a) + (b * b))); } for (let i = 0; i < k; i++) { arr = arr.sort(); result.push(arr[i][0]) } return result; } console.log(kClosest([ [-5, 4], [-6, -5], [4, 6] ], K = 2)) 

预期输出:[ - 5,4],[4,6] //我有[-5,4],[ - 6,-5]

我建议使用自定义排序 - 你可以传递Array.sort()一个比较函数,如下所示:

 function kClosest(points, k) { //sorts the array in place points.sort((point1, point2) => { const distanceFromOrigin1 = getDistanceFromOrigin(point1); const distanceFromOrigin2 = getDistanceFromOrigin(point2); //sort by distance from origin, lowest first return distanceFromOrigin1 - distanceFromOrigin2; }); //returns first k elements return points.slice(0, k); } function getDistanceFromOrigin(point) { const [x, y] = point; //array destructuring return (x*x) + (y*y); } console.log(kClosest([ [-5, 4], [-6, -5], [4, 6] ], 2)) 

有关自定义排序的更多详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

对整个阵列进行排序是浪费的,甚至可能无法实现。 这是浪费,因为这个问题没有要求所有元素的总排序,甚至不是k元素。 使用基于比较的排序进行排序需要O(n log(n))时间。 更一般地说,如果输入是数字流,则将所有数据存储在存储器中并对它们进行排序甚至是不可能的。

我对JavaScript知之甚少,但在一般的算法草皮上,我们可以使用以下两种方法之一更快地解决这个问题:

  1. 使用最大优先级队列 :根据与原点的距离创建具有排序的最大PQ。 继续将元素插入max PQ中,当大小超过k ,删除顶部元素(最大值)。 最后,PQ将具有k最小元素。 空间复杂度: O(k) ,时间复杂度: O(n log(k))对于k << n ,可以接近O(n)
  2. 使用快速选择 :在输入上快速选择k次。 这假设输入适合存储器(空间O(n) ),但是在O(nk)时间内运行,对于k << n ,可以接近O(n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM