编写一个函数,该函数查找最近的餐馆并返回所提供餐馆的最近目标数目。 allLocations是坐标[x,y]的数组。距离由sqrt(x ^ 2 + y ^ 2)计算。用户位置始终始于[0,0]
function nearestResturants(totralRes,allLocations,toReturn)
样本输入:最近的Resturants(4,[[1,1],[4,2],[7,8],[9,3]],2)
我的计划是创建一个对象数组,每个对象的位置和计算出的距离。然后返回包含坐标的排序数组,并返回第一个toReturn
坐标。
function nearestResturants(totralRes,allLocations,toReturn) {
const locs = allLocations.map(location => {
return {
loc: location,
distance: calcDistance(location)
}
});
}
function calcDistance(location) {
var dis = Math.pow(location[0],2) + Math.pow(location[1],2);
return Math.sqrt(dis);
}
locs的输出也很奇怪,因为它会返回[object object]
1.有没有更快的方法可以做到这一点?因为这至少会导致O(nlogn)
。
2.如何更好,更轻松地做到这一点?
答案 0 :(得分:1)
有两种解决方法:
k
个元素- O(nlogn)
k
元素- O(n + logn*k).
请考虑以下方法:
function nearestResturantsWithSort(totralRes,allLocations,toReturn) {
const locs = allLocations.map(location => {
return {loc: location, distance: calcDistance(location)};
});
locs.sort((a,b) => (a.distance > b.distance) ? 1 : ((b.distance > a.distance) ? -1 : 0));
return locs.slice(0, toReturn);
}
var Heap = require('heap');
function nearestResturantsWithHeap(totralRes,allLocations,toReturn) {
let locs = allLocations.map(location => {
return {loc: location, distance: calcDistance(location)};
});
return Heap.nsmallest(locs, toReturn, function(a, b) { return a.distance - b.distance; });
}
function calcDistance(location) {
return Math.sqrt(Math.pow(location[0],2) + Math.pow(location[1],2));
}
我建议您当然选择第二种方法(堆)