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(内部元件+范围)){ isMatch=false; 打破 } } 如果(isMatch){ /*当元素匹配时,将以前匹配的索引设置为当前arary索引(如果尚未匹配)* *尚未为当前数组设置。请不要为数组本身增加数组匹配*/ if(allArraysIndex!==arraysIndex&&previouslyMatchedIndex!==allArraysIndex){ totalArraysMatched++; 先前匹配的索引=阵列索引; } //在内部结果数组中添加compare to元素并增加其索引。 内在结果
[
    [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 ] ]