计算段总长度的算法

Algorithm to total the combined length of segments

我正在调查这个问题:

假设我们在 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