algorithm - 从间隔列表中有效地找到重叠间隔

标签 algorithm list data-structures intervals interval-tree

这与寻找重叠区间有关。我知道如何在给出间隔列表(间隔树)的情况下这样做。我所拥有的是间隔列表的列表。例如,

[2,6], [7,11]
[1,3], [5,10], [11,13]
[2,5], [6,8]

结果应该是

[2,3], [7,8]

我需要做的是找到所有列表中共有的间隔列表。

我认为这个问题类似于合并 n 列表。问题是我不能应用列表的成对合并。应用此方法可能会导致重叠间隔丢失。所以我需要将所有列表合并在一起,同时考虑所有列表(而不是成对)。

我可以使用区间树。将每个列表中的第一个区间插入区间树并找到重叠部分。从树中删除最弱的间隔并从列表之一插入下一个间隔。我还没有完全弄清楚如何使用这种方法,但它似乎会变得太贵了。

是否有任何有效的算法可以从间隔列表中找到重叠间隔?

附加信息: 列表中的间隔已排序。它们不重叠并形成序列。

最佳答案

创建一个单一的、排序的转换数组。每个转换都有一个位置,以及一个基于您加入或离开的间隔数的累积数字。当您遍历列表时,请跟踪您处于多少个间隔中。当您处于与系列一样多的间隔中时,就是您处于一个公共(public)间隔中。

对于您的示例,过渡将是:

[2, 1], [6, -1], [7, 1], [11, -1],
[1, 1], [3, -1], [5, 1], [10, -1], [11, 1], [13, -1]
[2, 1], [5, -1], [6, 1], [8, -1]

按位置排序并合并后折叠为:

[1, 1], [2, 2], [3, -1], [5, 0], [6, 0], [7, 1], [8, -1], [10, -1], [11, 0], [13, -1]

它为您提供运行总计的转换:

[1, 1], [2, 3], [3, 2], [7, 3], [8, 2], [10, 2], [13, 1]

然后我们可以读出我们在 3 处的间隔,一个从 2 开始到 3,另一个从 7 并转到 8。哪个是答案。

创建一个长列表和排序的想法是公认的额外工作。您可以改为创建这些列表并即时合并它们。节省是序列数的对数而不是事件数的对数的一个因素。

关于algorithm - 从间隔列表中有效地找到重叠间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18373509/

相关文章:

java - 计算圆中的每个笛卡尔点

python - Django 模型 : Keep track of activity through related models?

data-structures - Redis 中的复合键/二级索引策略

algorithm - 在不到 O(n) 的时间内搜索与模式 "abc:*:xyz"匹配的字符串

algorithm - 有效地找到圆和网格的交点

javascript - 将javascript对象合并到另一个根

python - 迭代从 .txt 文件转换的列表时遇到问题

python - 为什么 Python 中一个变量可以全局访问,而另一个则不能?

list - Haskell 从另一个等式中找到列表的长度

java - 如何通过位操作转换大小写?