Python:动态区间数据结构

时间:2010-10-25 11:51:07

标签: python overlap intervals

我正在寻找一些python代码来有效地计算间隔重叠。 我之前使用过bx-python包的区间树,但现在需要从树中删除区间(或者更好,修改它们)。 看来bx-python树不支持这个。

任何指针?

3 个答案:

答案 0 :(得分:3)

banyan支持从树中删除间隔。例如,要从间隔列表中删除最少数量的间隔,使得剩余的间隔在O(n log n)中不重叠,可以使用banyan.SortedSet(增强的红黑树):

from banyan import SortedSet, OverlappingIntervalsUpdator # pip install banyan

def maximize_nonoverlapping_count(intervals):
    # build "interval" tree sorted by the end-point O(n log n)
    tree = SortedSet(intervals, key=lambda (start, end): (end, (end - start)),
                     updator=OverlappingIntervalsUpdator)
    result = []
    while tree: # until there are intervals left to consider
        # pop the interval with the smallest end-point, keep it in the result
        result.append(tree.pop()) # O(log n)

        # remove intervals that overlap with the popped interval
        overlapping_intervals = tree.overlap(result[-1]) # O(m log n)
        tree -= overlapping_intervals # O(m log n)
    return result

示例:

print maximize_nonoverlapping_count([[3, 4], [5, 8], [0, 6], [1, 2]])
# -> [[1, 2], [3, 4], [5, 8]]

请参阅Python - Removing overlapping lists

答案 1 :(得分:0)

也许存储所有交叉口的间隔可以提供帮助。

你需要:

  • 所有区间联合的边界,
  • 表示每个交叉口左边界和交叉点的间隔列表。

交点间隔可以存储在树中,因为它们仅用左边界表示。方法插入和删除间隔看起来像(简化):

插入:找到新间隔的左右边界的交点间隔,将这些交点间隔分成2或3个新的交点间隔。对于每个交集间隔添加指向新间隔的指针。

删除:找到左右边界的交叉口间隔,将它们合并到之前的交叉口间隔。对于删除指针与删除间隔之间的每个交集间隔。

答案 2 :(得分:0)

如果您正在寻找处理间隔算术的Python库,请考虑python-interval。免责声明:我是该图书馆的维护者。

此库支持检查重叠并自动合并间隔。例如:

>>> import intervals as I
>>> I.closed(1,2) | I.closed(2,3)
[1,3]
>>> I.closed(1,2).overlaps(I.closed(3,4))
False

如果您想专门计算重叠:

>>> I.closed(1,3) & I.closed(2, 4)
[2,3]

它支持开放/封闭间隔,有限或无限。要删除给定区间的间隔,只需使用差值运算符:

>>> I.closed(1, 4) - I.closed(2, 3)
[1,2) | (3,4]

如果你能更具体一点,我可以帮助你。