确定范围是否与现有范围重叠,如果不是,则添加范围

时间:2015-02-16 10:50:34

标签: python range overlap

我需要实现一个输入范围为(start, end)的算法,我必须确定范围是否与任何现有范围重叠,例如[(s1, e1), (s2, e2), ...]。如果是,可选返回重叠范围。如果不是,请将范围附加到列表中。

我已阅读this question on S.O,遗憾的是我不确定这是否适合我的情况,因为每个范围的startend可能在数百万。不,我不能减少幅度;我需要单位精度。

搜索周围,我发现Mr. Ned Batchelder's trick,虽然已经进行了优化,但如果我必须通过数千个元组进行比较,我会关注性能影响。

现在如果推动推进,我想我会在列表中重复后一招,但我当然希望有更好的方法。

(注意:我没有 将现有范围存储在元组列表中。如果有更好的方法,我可以将范围元组编组到必要的结构中。但输入必须(start, end)

如果你有更好的方法,小心分享?

2 个答案:

答案 0 :(得分:1)

二叉树似乎是一个很好的匹配

如果你得到像

这样简单的东西
class node():
    def __init__(self, val):
        self.val = val
        self.less = None
        self.more = None

然后有一些功能适合树:

def fit(val, top_node):
    current_node = top_node
    while True:
        if val[0] < current_node.val[0] and val[1] < current_node.val[0]:
            if current_node.less:
                 current_node = current_node.less
                 continue
            else:
                 current_node.less = node(val)
                 break
        elif val[0] > current_node.val[1]:
            if current_node.more:
                current_node = current_node.more
                continue
            else:
                current_node.more = node(val)
                break
        print('not a fit!')
        break

现在剩下的就是如果由于树太深而导致事情进展缓慢

答案 1 :(得分:1)

你想要的是interval trees。它们是包含(重叠)间隔的数据结构,允许有效的查询,插入和删除。实际上已经证明他们的查询时间复杂性是最佳的。

如果您只处理非重叠范围操作会更有效率,但使用它们没有任何缺点,尽管它们可以处理一般情况。

可以下载intervaltree个包。