Javascript 如何查找范围之间的差距?

Javascript 如何查找范围之间的差距?,javascript,arrays,algorithm,range,Javascript,Arrays,Algorithm,Range,让我们使用以下范围示例: 常数范围=[ [ 0, 10, ], [ 20, 30, ], [ 40, 50, ], ]; 我想查找两个范围值之间缺少的范围,例如,如果输入为[-10,60],则预期输出必须为: 康斯特群岛=[ [ -10, -1, ], [ 11, 19, ], [ 31, 39, ], [ 51, 60, ], ]; 我尝试搜索不相交的范围和不相交的范围以及类似的关键字。这似乎是一个以前可以解决一百万次的问题。也许我只是使用了错误的关键字。我确实成功地编写了一个涵盖了我所能想到

让我们使用以下范围示例:

常数范围=[ [ 0, 10, ], [ 20, 30, ], [ 40, 50, ], ]; 我想查找两个范围值之间缺少的范围,例如,如果输入为[-10,60],则预期输出必须为:

康斯特群岛=[ [ -10, -1, ], [ 11, 19, ], [ 31, 39, ], [ 51, 60, ], ];
我尝试搜索不相交的范围和不相交的范围以及类似的关键字。这似乎是一个以前可以解决一百万次的问题。也许我只是使用了错误的关键字。

我确实成功地编写了一个涵盖了我所能想到的所有边缘情况的实现

如果没有其他人提供权威答案,我将分享这一点。我希望有一个更智能的解决方案:

const getGaps=ranges:RangesType:RangesType=>{ 常数间隙=[]; //$FlowFixMe 对于范围中的常量索引{ 常数开始=范围[Numberindex][1]; 常量结束=范围[Numberindex+1]?[0]; 如果开始<结束{ 推[ 开始+1, 完二〇〇一年一月一日,, ]; } } 返回间隙; }; const getMissingRanges=ranges:RangesType,from:number,to:number:RangesType=>{ 如果ranges.length==0{ 返回[ [ 从…起 到 ], ]; } 常数间隙=[ [ 数字,负无穷大, 范围[0][0]-1, ], …获得差距 范围, , [ 范围[ranges.length-1][1]+1, 正无穷大, ], ]; 返回间隙 .filtergap=>{ 返回isRangeOverlappinggap,[从,到]; } .mapgap=>{ 返回[ Math.maxgap[0],来自, Math.mingap[1],到, ]; }; };
查找区间交叉点的主要数据结构之一是。您可以在范围上构造一个区间树,并通过在树上查询来跟踪输入范围与它们的交点。然后,从输入范围的左侧到右侧扫掠以查找间隙

例如,您可以在javascript中找到许多间隔树的实现。

常数findMissing=arr,范围=>{ [min,max]=arr; 返回范围.reduceAC、a、i=>{ 如果[0]a[1]acc.push[a[1]+1,max]; 最小值=a[1]+1; 返回acc }, [] } 让范围=[[2,10],[5,7],[40,50]] 控制台.日志管理[-10,60],范围; 范围=[[0,10],[20,30],[40,50];
控制台.日志管理[-10,60],范围;我显然把这件事复杂化了。谢谢@加朱:这是不对的。您可以发现它不适用于以下情况,例如:const ranges=[[2,10]、[5,7]、[40,50];输入范围[-10,60]@Gajus比这更复杂。因为区间可能部分重叠,甚至完全被其他区间覆盖。@OmG-所以预期结果是[-10,1]、[9,6]、[8,39]?预期结果是[-10,1]、[11,39]、[51,60]。这通过了本文中描述的所有测试用例。