【发布时间】:2021-12-20 22:04:18
【问题描述】:
我需要想出一个算法来重新组织 Event(StartTime,EndTime) 的数组,根据一个优先值。如图所示,重叠最多有 2 个事件。想象一下,我有以下时间线,每个事件都有一个关联的值:
我需要找到并考虑如下冲突:
- A 与 B:以 B 为冲突区域:
添加到最终列表:
A [0:00, 0:15](修改后的 A) 加入最终名单:B [0:15, 0:30] - A 与 C:以 A 为冲突区域:
需要创建一个新事件,添加到最终列表:
A-NEW1 [0:30, 1:15]注意 C 完全消失了 - A 与 D:以 A 为冲突区域:
保持
A-NEW1不变 添加到最终列表:D [1:15, 2:00](修改为 D) - D vs. E:以 E 为冲突区域:
添加到最终列表:
D [1:15, 1:45](修改为 D) 加入最终名单:E [1:45, 2:30]
最终名单:
A [0:00, 0:15]
B [0:15, 0:30]
A-NEW1 [0:30, 1:15]
D [1:15, 1:45]
E [1:45, 2:30]
我的主要问题是,我如何在这个算法中循环?我不能只在一个直接的 for 循环中考虑每个 N 和 N+1。例如,我不想比较 B/C,因为它们不重叠。看来我必须考虑冲突组中的每个冲突对。但是我不清楚如何在一个组中找到这些冲突对,以及如何循环它们。这是笛卡尔积还是什么?
而且,一般来说,它看起来像
(when all events are Sorted ASC by StartTime)
1. Comparing N and N+1: if N has priority:
1a. If N+1 fully contained within (N+1's EndTime <= N's EndTime):
Add N
Do not add N+1
1b. If N+1 not fully contained within (N+1's EndTime > N's EndTime):
Add N
Add N+1(N's EndTime, N+1's EndTime)
2. Comparing N and N+1: if N+1 has priority:
Add N(StartTime, N+1's StartTime)
Add N+1
但是这个逻辑没有考虑创建有时是必要的“New”事件,如上面的A/C比较所示。我们有时需要创建一个“延续”事件,而原来的事件可能会被打断。
关于这个问题的任何想法,以及如何正确循环?
【问题讨论】: