我正在寻找一些 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 - 删除重叠列表。
也许存储所有相交间隔会有所帮助。
你需要:
相交区间可以存储在树中,因为它们仅用左边界表示。方法插入和删除间隔看起来像(简化):
插入:找到新区间左右边界的交叉区间,将这些交叉区间拆分为 2 或 3 个新的交叉区间。对于每个相交间隔,将指针添加到新间隔。
删除:查找左右边界的交叉区间,合并到之前的交叉区间。对于删除指针到删除间隔之间的每个交集间隔。
如果您正在寻找处理区间算术的 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]
如果您可以更具体一点,我可以帮助您。