问题
假设我有两个区间集合,分别命名为 A 和 B。我如何以最节省时间和内存的方式找到差异(相对补码)?
图片说明:
区间端点是整数( ≤ 2 128 -1 ),它们总是 2 n长并且在 m×2 n晶格上对齐(所以你可以用它们制作二叉树)。
间隔可以在输入中重叠,但这不会影响输出(如果展平,结果将是相同的)。
问题是因为两个集合中有很多间隔(最多 100,000,000),所以幼稚的实现可能会很慢。
输入是从两个文件中读取的,并以这样一种方式进行排序,即较小的子间隔(如果重叠)按大小顺序紧随其父级之后。例如:
[0,7]
[0,3]
[4,7]
[4,5]
[8,15]
...
我尝试了什么?
到目前为止,我一直在研究一种生成二叉搜索树的实现,同时聚合[0,3],[4,7] => [0,7]
来自两个集合的相邻区间 (如有必要,在第一棵树中间隔)。
虽然这似乎适用于小型集合,但它需要越来越多的 RAM 来保存树本身,更不用说完成插入和从树中删除所需的时间了。
我认为由于间隔是预先排序的,我可以使用一些动态算法并一次性完成。但是,我不确定这是否可能。
那么,我将如何以有效的方式解决这个问题呢?
免责声明:这不是作业,而是对我面临的实际问题的修改/概括。我正在用 C++ 编程,但我可以接受任何 [命令式] 语言的算法。