我有两组范围。每个范围都是一对整数(开始和结束),表示单个较大范围的某个子范围。两组范围的结构与此类似(当然 ...s 将替换为实际数字)。
$a_ranges =
{
a_1 =>
{
start => ...,
end => ...,
},
a_2 =>
{
start => ...,
end => ...,
},
a_3 =>
{
start => ...,
end => ...,
},
# and so on
};
$b_ranges =
{
b_1 =>
{
start => ...,
end => ...,
},
b_2 =>
{
start => ...,
end => ...,
},
b_3 =>
{
start => ...,
end => ...,
},
# and so on
};
我需要确定集合 A 中的哪些范围与集合 B 中的哪些范围重叠。给定两个范围,很容易确定它们是否重叠。我只是使用双循环来执行此操作——在外循环中遍历集合 A 中的所有元素,在内循环中遍历集合 B 的所有元素,并跟踪哪些元素重叠。
这种方法有两个问题。首先是重叠空间非常稀疏——即使每个集合中有数千个范围,我希望集合 A 中的每个范围都与集合 B 中的 1 或 2 个范围重叠。我的方法列举了每一种可能性,即矫枉过正。这导致了我的第二个问题——它的扩展性非常差。当每组中有数百个范围时,代码会很快(不到一分钟)完成,但当每组中有数千个范围时,代码会花费很长时间(+/- 30 分钟)。
有没有更好的方法可以索引这些范围,这样我就不会做太多不必要的重叠检查?
更新:我正在寻找的输出是两个散列(每组范围一个),其中键是范围 ID,值是与该集合中的给定范围重叠的另一组范围的 ID。