给定一个表示点的数组数组,我想找到点之间的最小距离并返回该距离和起始点。我正在使用lodash,并希望尽可能的功能。
我有一个数组数组:
var all = [[1,2], [3,4], [4,5]];
我还有一个具有当前最小距离和当前数组的对象:
var cur_min = {'current_min': 10, 'point': [9,10]};
我想找到我的数组中所有点之间的最小距离,如果该距离小于我的cur_min变量中的current_min,它将被更新。我想出了以下内容:
function find_new_min(current, arr) {
return _.transform(arr, function(result, a) {
_.forEach(arr, function(b) {
if (!_.isEqual(a,b)) {
var d = get_distance(a,b);
if (d<result.current_min) {
result.current_min = d;
result.point = a;
}
}
});
}, _.clone(current));
}
我期待6对不同的数组,因为得到一个点与它自身之间的距离是0.
我无法想象两次循环同一个数组是解决这个问题的有效方法。我试图使用各种lodash函数重写此函数,如_.forEach和_.reduce,但我找不到在同一个数组上不循环两次的方法。有没有更快的方法来解决这个问题?
上述代码的示例输出是:
{ current_min: 1.222450611061632, loc: [ 1, 2 ] }
答案 0 :(得分:1)
您的问题是最古老的问题之一:如何根据某些功能键最有效地对值数组进行排序。但是,您还需要记录最短距离,并且需要与每个其他值进行比较。因此,您无法有效排序,需要遍历整个数组array.length
次。
考虑到你只期望六对点,这似乎是premature optimization的严重情况。
可读性方面,不幸的是,lodash不提供生成笛卡尔积的功能,然后你可以_.sortBy
,它也不提供允许你手动左右比较并修改值的排序功能。我认为你当前的实现目前和lodash一样好。