Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:动态区间数据结构_Python_Overlap_Intervals - Fatal编程技术网

Python:动态区间数据结构

Python:动态区间数据结构,python,overlap,intervals,Python,Overlap,Intervals,我正在寻找一些python代码来有效地计算间隔重叠。 我以前使用过bx python包的间隔树,但是现在需要从树中删除间隔(或者更好的是,修改它们)。 bx python树似乎不支持这一点 有指针吗?也许存储所有交叉点间隔会有所帮助 你需要: 所有间隔的并集边界 对于每个交叉点,左边界和交叉点的间隔列表 交叉点间隔可以存储在树中,因为它们仅用左边界表示。插入和删除间隔的方法类似(简化): 插入:查找新区间左右边界的交点区间,将这些交点区间拆分为2或3个新交点区间。对于每个相交间隔,将指针添加

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


有指针吗?

也许存储所有交叉点间隔会有所帮助

你需要:

  • 所有间隔的并集边界
  • 对于每个交叉点,左边界和交叉点的间隔列表
交叉点间隔可以存储在树中,因为它们仅用左边界表示。插入和删除间隔的方法类似(简化):

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

删除:查找左右边界的相交间隔,将它们合并到之前的相交间隔。对于每个相交间隔,请将指针移到已删除间隔。

支持从树中删除间隔。例如,要从间隔列表中删除最小数量的间隔,以便剩余的间隔不会在
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]]

参阅

< p>如果你正在寻找一个处理间隔算法的Python库,考虑一下。免责声明:我是该库的维护者

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

>>> 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]

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

我最近需要这样做,并决定在一个(红/黑)btree中使用一组
(start,length)
对,由
start
(用C编写,带有Python绑定)索引。然后我意识到,在我的例子中,位图将是足够有效的,当然位图实现相对来说是微不足道的。这对你有用吗?谢谢你的回复!在我的例子中,事情更复杂一些,因为我需要将数据附加到每个间隔,当间隔被更改或合并时,我也需要更改/合并相应的数据。不确定保持从位数组区域到数据的映射是否容易/高效。在树中,我只需将数据存储在节点中。我看到您的库仅限于整数、浮点以及其他默认变量类型。但我发现这个库在版本控制方面有着惊人的用途。例如,I.openclosed(1.2.1,1.3.2)将是(1.2.1,1.3.2),并且将包含从1.2.1.x、>1.2.2到1.3.2的所有内容。它不限于整数或浮点数,而是允许将任何可比较的值存储为边界。这很有趣,您建议使用版本作为边界,因为这正是我最初创建此库的原因;-)我需要一种统一的方法来编码不同包装生态系统中使用的依赖约束,最简单的方法是将所有这些约束转换为间隔(当时我没有找到一个库来处理这些间隔)。这太棒了。我想知道你是否有版本控制库的开源版本。我试着用我自己的和你的。我得到AttributeError的AttributeError:“\u PInf”对象没有属性“vlist”vlist这里是我的版本控制类中的一个对象,它是从版本字符串派生的。请查看此处: