线段合并长度总和的算法 [英] Algorithm to total the combined length of segments

查看:0
本文介绍了线段合并长度总和的算法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在调查此问题:

假设我们在X轴上有N个起点和终点不同的线段。下面的数据结构描述了这一点:

[(start1, end1),..., (startN, endN)]

现在我们要计算这些段的总大小,重叠不应重复计算。

示例

输入:[(0,3),(1,2), (6,7)]
输出:4

由于线段(1,2)与线段(0,3)重叠,0到3的距离仅为3,6到7的距离为1,因此3+1=4。

问题

是否有针对大输入大小进行此计算的算法?

推荐答案

您可以按如下方式操作:

提取每对的坐标并标记它们是否结束段(标志)或不结束(当它们开始一个段时)。对这些新的对(x,end)进行排序。然后对它们进行处理。当坐标开始分段时,将坐标推入堆栈。当它结束一段时,从堆栈中弹出相应的开始坐标。如果堆栈为空,则将结束坐标和开始坐标之间的差加到总计中:

lst = [(0,3),(1,2), (6,7)]

stack = []
total = 0
for x, end in sorted((x, i) for pair in lst for i, x in enumerate(pair)):
    if end:
        start = stack.pop()
        if not len(stack):
            total += x - start
    else:
        stack.append(x)

print(total)  # 4

这篇关于线段合并长度总和的算法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆