2014-08-29 76 views
0

給定一個代表點的陣列數組,我想要找到點之間的最小距離並返回該距離和該起點。我正在使用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

我無法想象循環相同的陣列上兩次是有效的方法來解決這個問題。我試着用_.forEach和_.reduce這樣的各種lodash函數來重寫這個函數,但是我找不到一種方法不能在同一個數組上循環兩次。有沒有更快的方法來解決這個問題?

的示例輸出用於上述代碼是:

{ current_min: 1.222450611061632, loc: [ 1, 2 ] } 
+0

你可以發佈一個輸出的例子嗎? – elclanrs 2014-08-29 01:31:55

+0

不知道你如何定義「效率」,而是用速度更快地手動迭代數組,而不是使用迭代器函數和所有那些。特別是當你期待6雙。 – 2014-08-29 01:41:40

+0

我希望它能夠採取任何長度的數組。 6只是一個例子。在相同的陣列上循環兩次無法高效。 – Ptrkcon 2014-08-29 01:47:50

回答

1

您的問題是最古老的一種:如何最有效地排序基於某些功能鍵的值的數組。但是,您還需要記錄最短距離,並且需要與每個其他值進行比較。正因爲如此,你無法高效地排序,你需要遍歷整個陣列array.length次。

考慮到您只需要6對積分,這看起來像是premature optimization的嚴重情況。

可讀性很差,不幸的是lodash不提供生成笛卡爾產品的功能,然後您可以使用_.sortBy,也不提供允許您手動比較左側和右側並修改值的排序功能。我認爲你目前的實現和lodash一樣好。