我正在寻找一些Python代码来有效地计算区间重叠。我以前使用过bx-python包的区间树,但现在需要从树中删除区间(或更好的是,修改它们)。似乎bx-python树不支持这个功能。有什么指针吗?
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 - 移除重叠的列表。
>>> 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]
如果您能更具体地说明问题,我可以帮助您。
也许存储所有交集区间可以帮助解决问题。
您需要:
交集区间可以存储在树中,因为它们仅用左边界表示。插入和删除区间的方法如下(简化):
插入:查找新区间左右边界的交集区间,将这些交集区间分成2或3个新的交集区间。对于每个之间的交集区间,添加指向新区间的指针。
删除:查找左右边界的交集区间,并将它们合并到之前的交集区间中。对于每个之间的交集区间,删除指向已删除区间的指针。
(起始位置,长度)
对在一个以起始位置
为索引的红黑树中(用C编写并带有Python绑定)。然后我意识到,在我的情况下,位图足够高效,并且当然,位图实现相对简单。这个方法对你有用吗? - Robie Basak