我需要实现一个输入范围为(start, end)
的算法,我必须确定范围是否与任何现有范围重叠,例如[(s1, e1), (s2, e2), ...]
。如果是,可选返回重叠范围。如果不是,请将范围附加到列表中。
我已阅读this question on S.O,遗憾的是我不确定这是否适合我的情况,因为每个范围的start
和end
可能在数百万。不,我不能减少幅度;我需要单位精度。
搜索周围,我发现Mr. Ned Batchelder's trick,虽然已经进行了优化,但如果我必须通过数千个元组进行比较,我会关注性能影响。
现在如果推动推进,我想我会在列表中重复后一招,但我当然希望有更好的方法。
(注意:我没有 将现有范围存储在元组列表中。如果有更好的方法,我可以将范围元组编组到必要的结构中。但输入必须为(start, end)
)
如果你有更好的方法,小心分享?
答案 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个包。