algorithm - 查找重叠的集合的间隔

标签 algorithm data-structures

所以我有一个包含区间端点的集合。例如,

Set s = {(1,4),(3,7),(5,8),(14,17),(0,2),(11,14)}

我需要一种方法来找出有多少重叠间隔。在上面的例子中,答案是 5,因为

(1,4) --> (3,7), (0,2)
(3,7) --> (5,8),(0,2)
(5,8) --> 
(14,17) --> (11,14)

我需要一种算法,它需要花费 O(N log N) 时间来找出总和。现在,如果我对所有起点进行排序并在每个点上应用此处建议的答案 Find number range intersection我得到一个 O(N^2) 解决方案。关于除了集合之外我可能需要哪种数据结构的任何线索?谢谢!

最佳答案

为每个区间 [a, b] 构建一个值列表 (a, -1), (b, 1)。现在对这些进行排序让您可以遍历数组,计算每个端点当前打开的间隔数,只需聚合 +1 和 -1。

重要的是 (b, 1) 在排序列表中出现在 (b, -1) 之后;因为即使交点在单个点,我们也想计算交点。

在这里完成代码。

def overlaps(intervals):
    es = []
    for a, b in intervals:
        es.append((a, -1))
        es.append((b, 1))
    es.sort()
    result = 0
    n = 0
    for a, s in es:
        if s == -1: result += n
        n -= s
    return result

请注意,这很简单 O(n log n),并且不需要任何花哨的数据结构。

关于algorithm - 查找重叠的集合的间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19085937/

相关文章:

java - 为什么我的解决方案无法找到二叉树的最小深度?

c++ - 为什么 std::accumulate 生成 705032704 作为输出而不是 vector 中元素的总和?

c# - 根据特定属性维护排序顺序的集合类?

c++ - 为模拟解析数据文件的优雅方式

ruby - 如何从其他间隔构建间隔数组

c++ - 代码理解问题

检测两个矩形相交的算法?

algorithm - 将列表分成 2 个相等的部分

c++ - 将结构作为 char 缓冲区传递给 proc 条目

.net - 列表<T> 或链表<T>