在给定的位置找到最近的餐厅

时间:2019-02-05 05:41:49

标签: javascript arrays algorithm sorting

编写一个函数,该函数查找最近的餐馆并返回所提供餐馆的最近目标数目。 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.如何更好,更轻松地做到这一点?

1 个答案:

答案 0 :(得分:1)

有两种解决方法:

  1. 对构建的数组进行排序,并返回前k个元素- O(nlogn)
  2. 使用堆获取最小的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));
}

我建议您当然选择第二种方法(堆)