Javascript 如何在其他重叠数字范围之间找到自由数字范围

Javascript 如何在其他重叠数字范围之间找到自由数字范围,javascript,node.js,algorithm,Javascript,Node.js,Algorithm,我有n个数组。每个数组有m个元素。每个元素m由两个属性[数字]组成 { start: x end: y } 起始和结束数字一起描述一个范围。所以开始总是比结束小。 我试图找到自由数范围(同样是开始和结束),它们位于所有数组中的范围元素之间。另外,结果在一个范围内有界 例如: var boundary = { start: 0, end: 600 }; // for example i use two arrays with ranges, but in reality

我有n个数组。每个数组有m个元素。每个元素m由两个属性[数字]组成

{
  start: x
  end: y
}
起始和结束数字一起描述一个范围。所以开始总是比结束小。 我试图找到自由数范围(同样是开始和结束),它们位于所有数组中的范围元素之间。另外,结果在一个范围内有界

例如:

var boundary = {
    start: 0,
    end: 600
};

// for example i use two arrays with ranges, but in reality they are n (>= 1)
var numbersRanges1 = [
    {start: 100, end: 120},
    {start: 180, end: 200},
    {start: 400, end: 500}
];

var numbersRanges2 = [
    {start: 10, end: 80},
    {start: 150, end: 220},
    {start: 480, end: 500}
];

// result should look like
var expected = [
    {start: 0, end: 10},
    {start: 80, end: 100},
    {start: 120, end: 150},
    {start: 220, end: 400},
    {start: 500, end: 600}
];
这就是我目前的工作解决方案()

var边界={
起点:0,
完:600
};
//例如,我使用了两个带范围的数组,但实际上它们是n(>=1)
变量numbersRanges1=[
{开始:100,结束:120},
{开始:180,结束:200},
{开始:400,结束:500}
];
变量numbersRanges2=[
{开始:10,结束:80},
{开始:150,结束:220},
{开始:480,结束:500}
];
//结果应该是这样的
预期风险值=[
{开始:0,结束:10},
{开始:80,结束:100},
{开始:120,结束:150},
{开始:220,结束:400},
{开始:500,结束:600}
];
//合并数组
var mergedRanges=numbersRanges1.concat(numbersRanges2);
//按开始排序
功能排序系统(a、b){
返回a.start-b.start;
}
mergedRanges=mergedRanges.sort(sortByStart);
//组重叠范围
对于(变量i=1;i边界。开始){
推({
开始:boundary.start,
结束:合并区域[0]。开始
});
}
for(变量i=1,mergedLen=mergedRanges.length;i

该脚本在node.js服务器上运行。因为我们做了很多像这样的并发计算,所以我试图找到一种资源效率高、性能好的算法。有没有更好的方法来实现这一点?我的代码中是否存在导致性能问题的陷阱?

这里有一个简化版本供您参考

// for example i use two arrays with ranges, but in reality they are n (>= 1)
var numbersRanges1 = [
    {start: 100, end: 120},
    {start: 180, end: 200},
    {start: 400, end: 500}
];

var numbersRanges2 = [
    {start: 10, end: 80},
    {start: 150, end: 220},
    {start: 480, end: 500}
];

var boundary = {
    start: 0,
    end: 600
};

// merge arrays
var mergedRanges = numbersRanges1.concat(numbersRanges2);

// sort by start
function sortByStart(a, b){
    return a.start - b.start;
}

mergedRanges = mergedRanges.sort(sortByStart);

// go throw merged ranges and save ranges between in addition array
var freeRanges = [];

var start=0;
mergedRanges.forEach(function(one) {
  if(one.start<start) return;
  freeRanges.push({start:start,end:one.start});
  start=one.end;
});

if(start<boundary.end) {
  freeRanges.push({start:start,end:boundary.end});
}

console.log(JSON.stringify(freeRanges,null,2));
//例如,我使用两个带范围的数组,但实际上它们是n(>=1)
变量numbersRanges1=[
{开始:100,结束:120},
{开始:180,结束:200},
{开始:400,结束:500}
];
变量numbersRanges2=[
{开始:10,结束:80},
{开始:150,结束:220},
{开始:480,结束:500}
];
变量边界={
起点:0,
完:600
};
//合并数组
var mergedRanges=numbersRanges1.concat(numbersRanges2);
//按开始排序
功能排序系统(a、b){
返回a.start-b.start;
}
mergedRanges=mergedRanges.sort(sortByStart);
//在两个数组之间切换合并范围并保存范围
var freeRanges=[];
var start=0;
mergedRanges.forEach(函数(一){

如果比我的容易多了,谢谢。
// for example i use two arrays with ranges, but in reality they are n (>= 1)
var numbersRanges1 = [
    {start: 100, end: 120},
    {start: 180, end: 200},
    {start: 400, end: 500}
];

var numbersRanges2 = [
    {start: 10, end: 80},
    {start: 150, end: 220},
    {start: 480, end: 500}
];

var boundary = {
    start: 0,
    end: 600
};

// merge arrays
var mergedRanges = numbersRanges1.concat(numbersRanges2);

// sort by start
function sortByStart(a, b){
    return a.start - b.start;
}

mergedRanges = mergedRanges.sort(sortByStart);

// go throw merged ranges and save ranges between in addition array
var freeRanges = [];

var start=0;
mergedRanges.forEach(function(one) {
  if(one.start<start) return;
  freeRanges.push({start:start,end:one.start});
  start=one.end;
});

if(start<boundary.end) {
  freeRanges.push({start:start,end:boundary.end});
}

console.log(JSON.stringify(freeRanges,null,2));