Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确定某个范围是否与现有范围重叠,如果不重叠,则添加该范围_Python_Range_Overlap - Fatal编程技术网

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)
打破
打印('不合适!')
打破
现在剩下的就是,如果由于树太深而导致事情进展缓慢,则需要进行细化。它们是一种包含(重叠)间隔的数据结构,允许高效的查询、插入和删除。事实上,已经证明它们的查询时间复杂度是最优的

如果只处理非重叠的范围,那么操作将更加有效,但是使用它们并没有缺点,尽管它们可以处理一般情况


有一个软件包可供下载

我假设列表中的现有范围没有重叠。它们是否已排序?否,现有范围不重叠,因为列表是从非重叠范围动态创建的。列表的当前实现未排序。但是,正如我所写的,如果性能需要,我可以强制对列表进行排序。那会有帮助吗?是的!排序当然会有帮助,因为它允许简单的搜索。缺点是,将新范围插入到已排序的列表中成本很高,特别是如果列表中已经有很多元组的话。因此,如果列表很大,插入速度较慢(因为它需要创建一个新的列表),那么使用某种形式的二叉树来存储元组可能是一种更好的策略。他们在最佳时间以更普遍的方式做你想做的事情。