Python 确定某个范围是否与现有范围重叠,如果不重叠,则添加该范围
我需要实现一个算法,其中输入是一个范围Python 确定某个范围是否与现有范围重叠,如果不重叠,则添加该范围,python,range,overlap,Python,Range,Overlap,我需要实现一个算法,其中输入是一个范围(开始、结束),我必须确定该范围是否与任何现有范围重叠,例如,[(s1、e1)、(s2、e2),…]。如果是,可以选择返回重叠范围。如果否,请将范围附加到列表中 我读过,不幸的是,我不确定这是否适合我的情况,因为每个范围的开始和结束可能在百万以内。不,我不能降低幅度;我需要单位精度 四处搜索,我发现,尽管非常优化,但如果我必须对数千个元组进行比较,我关心的是性能影响 现在,如果情况紧急,我想我会在列表中重复后一个技巧,但我当然希望有更好的方法 (注意:我不必
(开始、结束)
,我必须确定该范围是否与任何现有范围重叠,例如,[(s1、e1)、(s2、e2),…]
。如果是,可以选择返回重叠范围。如果否,请将范围附加到列表中
我读过,不幸的是,我不确定这是否适合我的情况,因为每个范围的开始
和结束
可能在百万以内。不,我不能降低幅度;我需要单位精度
四处搜索,我发现,尽管非常优化,但如果我必须对数千个元组进行比较,我关心的是性能影响
现在,如果情况紧急,我想我会在列表中重复后一个技巧,但我当然希望有更好的方法
(注意:我不必将现有范围存储在元组列表中。如果有更好的方法,我可以将范围元组封送到必要的结构中。但输入必须是(开始,结束)
)
如果你有更好的方法,愿意分享吗?二叉树在这里似乎是一个很好的匹配 如果你得到一些简单的东西,比如
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
def-fit(val,顶部节点):
当前节点=顶部节点
尽管如此:
如果val[0]当前_节点。val[1]:
如果当前_node.more:
当前节点=当前节点。更多信息
持续
其他:
当前_node.more=节点(val)
打破
打印('不合适!')
打破
现在剩下的就是,如果由于树太深而导致事情进展缓慢,则需要进行细化。它们是一种包含(重叠)间隔的数据结构,允许高效的查询、插入和删除。事实上,已经证明它们的查询时间复杂度是最优的
如果只处理非重叠的范围,那么操作将更加有效,但是使用它们并没有缺点,尽管它们可以处理一般情况
有一个软件包可供下载 我假设列表中的现有范围没有重叠。它们是否已排序?否,现有范围不重叠,因为列表是从非重叠范围动态创建的。列表的当前实现未排序。但是,正如我所写的,如果性能需要,我可以强制对列表进行排序。那会有帮助吗?是的!排序当然会有帮助,因为它允许简单的搜索。缺点是,将新范围插入到已排序的列表中成本很高,特别是如果列表中已经有很多元组的话。因此,如果列表很大,插入速度较慢(因为它需要创建一个新的列表),那么使用某种形式的二叉树来存储元组可能是一种更好的策略。他们在最佳时间以更普遍的方式做你想做的事情。