【发布时间】:2012-08-09 20:03:26
【问题描述】:
问题
假设我有两个区间集合,分别命名为 A 和 B。我如何以最节省时间和内存的方式找到差异(相对补码)?
图片说明:
区间端点是 整数 ( ≤ 2128-1 ) 并且它们总是 2n 长并且在 m×2 上对齐n lattice(这样你就可以用它们制作一棵二叉树)。
输入中的间隔可以重叠,但这不会影响输出(如果展平,结果是相同的)。
问题是因为两个集合中有很多间隔(最多 100,000,000),所以幼稚的实现可能会很慢。
输入是从两个文件中读取的,并以这样一种方式排序,即较小的子间隔(如果重叠)按大小顺序紧随其父级之后。例如:
[0,7]
[0,3]
[4,7]
[4,5]
[8,15]
...
我尝试了什么?
到目前为止,我一直在研究一种生成二叉搜索树的实现,同时聚合两个集合中的相邻区间 ([0,3],[4,7] => [0,7]),然后遍历第二棵树并“排除”存在的区间在两者中(如有必要,在第一棵树中细分较大的间隔)。
虽然这似乎适用于小型集合,但它需要越来越多的 RAM 来保存树本身,更不用说完成插入和移除树所需的时间了。
我想既然间隔是预先排序的,我可以使用一些动态算法并一次性完成。不过,我不确定这是否可行。
那么,我该如何有效地解决这个问题呢?
免责声明:这不是作业,而是对我面临的实际问题的修改/概括。我正在使用 C++ 编程,但我可以接受任何 [命令式] 语言的算法。
【问题讨论】:
-
如何进行简单的线性一次性搜索?似乎需要更少的内存,特别是如果您一次只存储一对间隔。
-
+1,@H2CO3。感觉这个问题和finding the intersection of two sorted arrays有点类似,所以这里可以应用线性搜索。
-
@Kevin 是的,基本上我只是想 KISS 和 b-tree 似乎有点开销。
-
@H2CO3 是的,这就是我的想法,但问题是间隔不需要完全匹配,而可以仅仅是彼此的子间隔。
-
也许你可以做第一次,丢弃或合并所有子间隔。
标签: c++ algorithm language-agnostic binary-tree