Javascript n个数组的基于距离的求交
假设我有以下三个数组:Javascript n个数组的基于距离的求交,javascript,algorithm,intersection,Javascript,Algorithm,Intersection,假设我有以下三个数组: [ [100, 110, 200, 300, 400], [40, 90, 99, 150, 200], [101, 202, 404, 505] ] 如何编写一个函数getIntersectingRanges(arrays,range),该函数将返回range的最大“宽度”的所有范围,其中包含所有数组中的一个或多个元素 因此,如果range=15,那么它将返回[[100,90,99,101],[100,110,99,101],[200,200,202]。这
[
[100, 110, 200, 300, 400],
[40, 90, 99, 150, 200],
[101, 202, 404, 505]
]
如何编写一个函数getIntersectingRanges(arrays,range)
,该函数将返回range
的最大“宽度”的所有范围,其中包含所有数组中的一个或多个元素
因此,如果range=15
,那么它将返回[[100,90,99,101],[100,110,99,101],[200,200,202]
。这些数组中的每一个都包含来自每个输入范围的至少一个元素,该范围的总“宽度”小于或等于15(第一个为11,第二个为11,第三个为3)
它在概念上非常简单,但我一直很难弄清楚如何编写这样一个函数。就像我不是在寻找一个完全充实的解决方案一样,我所需要的只是允许我这样做的算法的基础(尽管我显然也很乐意接受一个完全编写的函数)
由于有些人似乎在理解这一点上有问题,让我再举几个简单的例子(尽管手写这些东西有点难,所以如果我在某处出错,请原谅): 输入:
[[10,20,30,40,50,60,70,80,90],[55,84]
范围:
5
输出:
[[50,55],[55,60],[80,84]
输入:[[10,20,30],[40,50]
范围:
10
输出:
[[30,40]]
输入:[[15,30,699],[16,800],[10,801],[11,803]]
范围:
10
输出:
[[15,16,10,11]]
所以我的方法是首先只取前两个数组,然后搜索第二个数组范围内第一个数组中的所有元素。到目前为止,这似乎是有道理的,但鉴于这一开始,似乎不可能同时匹配上述示例中的第一个和第二个结果。。。因此,任何帮助都将不胜感激。也许这将满足您的需要: 函数getIntersectingRanges(数组,范围){ var finalResult=[];//最终结果。 var finalResultIndex=0;//最终结果的当前索引。 //在所有输入数组中循环。 对于(var arraysIndex=0;arraysIndex
[
[100, 110, 200, 300, 400],
[40, 90, 99, 150, 200],
[101, 202, 404, 505]
]
Array Values Comment
----- ---------------------------------------------------- --------------------------------------
0 100 110 200 300 400
1 40 90 99 150 200
2 101 202 404 505
1 here is no other value in this range
1 1 0 2 <- first group, values are in all arrays
1 0 2 0 <- second group, values are in all arrays
0 2 0 only values of two arrays
2 0 only values of two arrays
1 here is no other value in this range
01 2 <- third group, values are in all arrays
2 here is no other value in this range
0 here is no other value in this range
0 2 only values of two arrays
2 here is no other value in this range
[
[[100], [90, 99], [101]],
[[100, 110], [99], [101]],
[[200], [200], [202]]
]
var a1 = [[10, 20, 30, 40, 50, 60, 70, 80, 90], [55, 84]];
var a2 = [[10, 20, 30], [40, 50]];
var a3 = [[15, 30, 699], [16, 800], [10, 801], [11, 803]];
var range;
function applyArray( result, ar ) {
var newResArrayList = [];
result.forEach( function( resArray ) {
var max = Math.max.apply(null,[].concat(resArray));
var min = Math.min.apply(null,[].concat(resArray));
ar.forEach( function(arv) {
if((arv<=min+range)&&(arv>=max-range)) {
newResArrayList.push([].concat(resArray).concat(arv));
}
});
});
return newResArrayList;
}
range = 5;
console.log(a1.reduce( applyArray ));
range = 10;
console.log(a2.reduce( applyArray ));
range = 10;
console.log(a3.reduce( applyArray ));
[ [ 50, 55 ], [ 60, 55 ], [ 80, 84 ] ]
[ [ 30, 40 ] ]
[ [ 15, 16, 10, 11 ] ]