当前位置: 首页 > 知识库问答 >
问题:

从间隔列表中有效地查找重叠间隔

白翰海
2023-03-14

这与寻找重叠的间隔有关。给定一个间隔列表(间隔树),我知道如何做到这一点。我有一个间隔列表。例如,

[2,6], [7,11]
[1,3], [5,10], [11,13]
[2,5], [6,8]

结果应该是

[2,3], [7,8]

我需要做的是找到所有列表中常见的间隔列表。

我认为这个问题类似于合并列表。问题是我无法应用列表的成对合并。应用此方法可能会导致丢失重叠间隔。因此,我需要将所有列表合并在一起,一次考虑所有列表(而不是成对)。

我可以使用间隔树。将每个列表中的第一个间隔插入间隔树并查找重叠部分。从树中删除最弱的间隔,并从其中一个列表中插入下一个间隔。我还没有完全弄清楚如何使用这种方法,但它似乎太贵了。

是否有任何有效的算法可以从间隔列表中找到重叠的间隔。?

附加信息:列表中的间隔被排序。它们不重叠并形成序列。

共有3个答案

凌成天
2023-03-14

您说过,每个单独的间隔列表都是经过排序且不重叠的。所以

Keep track of where you are in each list, starting at the beginning of each.
While none of the lists has run out:
    If the current intervals (one from each list) all overlap:
       Output the intersection of the current intervals
    Find which of the current intervals has the earliest end point
    Advance one position within that list.

如果有K个间隔列表和N个间隔,如果以最直接的方式实现,这应该需要O(N K)时间,但您应该能够通过跟踪有关堆或其他一些优先级队列中当前间隔的信息来将其减少到O(N log K)时间。

王辉
2023-03-14

我的理解是在区间列表上应用交集运算。你可以两两做,因为交集是关联的。

我会这样做

Let S be the set of sets, R = s1, s1 in S
     for each set s2 in S / {s1}
              for each element e1 in R
                  for each element e2 in s2 s.t. e1.sup < e2.inf
                    e1 <- intersection (e1, e2)

两个区间之间的相交运算是

 intersection (e1,e2):
    return new Interval(max(e1.inf, e2.inf), min (e1.sup, e2.sup));
公西浩
2023-03-14

创建一个单一的、排序的转换数组。每个转换都有一个位置,以及一个基于您要加入或离开的间隔数的累积数。当您通过列表时,请跟踪您处于多少个间隔中。当您处于与系列相同的间隔中时,那就是您处于公共间隔中的时候。

对于您的示例,转换将是:

[2, 1], [6, -1], [7, 1], [11, -1],
[1, 1], [3, -1], [5, 1], [10, -1], [11, 1], [13, -1]
[2, 1], [5, -1], [6, 1], [8, -1]

按位置排序并合并后折叠为:

[1, 1], [2, 2], [3, -1], [5, 0], [6, 0], [7, 1], [8, -1], [10, -1], [11, 0], [13, -1]

这为您提供了运行以下总数的转换:

[1, 1], [2, 3], [3, 2], [7, 3], [8, 2], [10, 2], [13, 1]

然后我们可以读出3的间隔,一个从2开始到3,另一个从7开始到8。这就是答案。

诚然,创建一个长列表并进行排序的想法是额外的工作。您可以转而创建这些列表并动态合并它们。节省的费用是系列数量日志的因素,而不是事件数量日志的因素。

 类似资料:
  • 与其查询具有开始和结束日期的间隔列表,不如从列表中检索仅与搜索开始和结束日期重叠的所有间隔,最好的方法是: 使用整数示例,以整数间隔列表为例。在此列表中,以下是所有唯一的间隔集,其中每组中的每个间隔都相互重叠: 以下是DateInterval的类: 我将收到按开始时间排序的间隔列表,如下所示: (在这个示例列表中,开始日期和结束日期总是均匀地落在一小时上。但是,它们可以落在任何一秒上(或者毫秒)。

  • 问题内容: 我想从间隔与查询中指定的间隔相交的表中提取行。假设我有一个简单的表和两个查询参数,并且,表达查询的最简单方法是什么,以便找到具有至少一个公共元素的所有行? 更新: 为了使预期结果更加清晰,请在下面找到输入值和预期结果的列表。列是 。 问题答案: 更简单:

  • 假设我有一个这样的范围列表 现在我想找到一个范围,比如。我的算法应该给我这个范围的所有范围。例如,这个的输出应该是 <代码>输出-[1,3]、[2,5]、[4,6]、[8,10] 我该如何着手解决这个问题? PS:我知道段树可能会有所帮助。我可以在其中构建树来存储间隔并查询位于间隔内的Point,但如何在给定间隔的情况下获取所有间隔。

  • 问题内容: 问题:给定一组任意时间间隔的时间,将所有重叠的时间间隔合并为一个,然后输出结果,该结果应该只有互斥的时间间隔。为了简单起见,将间隔表示为整数对。例如,让给定的间隔集为{{1,3},{2,4},{5,7},{6,8}}。间隔{1,3}和{2,4}彼此重叠,因此应将它们合并并成为{1,4}。同样,{5,7}和{6,8}应该合并并成为{5,8} 编写一个函数,该函数为给定间隔集生成合并间隔集

  • 问题内容: 我有下表,其中包含每15分钟从几个不同的设备读取的值: 我想在表中找到每个月在给定月份中没有条目的所有设备的所有差距。对于上表,结果应该是这样的: 该表大约有35000台设备和1亿个条目。 这是我尝试过的;它很慢,但是返回我需要的。但是,除了速度之外,还有另一个问题:它只能找到在给定月份设备的最后一个条目之前丢失的时间间隔;之后的所有内容都将被忽略,因此有可能会错过额外的缺失值间隔。

  • 问题内容: 我在数据库中有2个表,这些表具有以下属性: 第二个表是“预订”和“资源”之间的关联实体(即1个预订可以包含许多资源)。属性booking_start和booking_end是带有日期和时间的时间戳。 我是否可以知道如果日期/时间与其他类似resource_id的预订重叠或冲突,我如何能够找到每个resource_id(预订的)? 我以图形方式在纸上涂上答案,以查看它是否可以帮助我形象化