【问题标题】:Algorithm to Resolve Conflicts on a Timeline Based on Priority Value基于优先级值解决时间线冲突的算法
【发布时间】:2021-12-20 22:04:18
【问题描述】:

我需要想出一个算法来重新组织 Event(StartTime,EndTime) 的数组,根据一个优先值。如图所示,重叠最多有 2 个事件。想象一下,我有以下时间线,每个事件都有一个关联的值:

我需要找到并考虑如下冲突:

  1. A 与 B:以 B 为冲突区域: 添加到最终列表: A [0:00, 0:15](修改后的 A) 加入最终名单: B [0:15, 0:30]
  2. A 与 C:以 A 为冲突区域: 需要创建一个新事件,添加到最终列表: A-NEW1 [0:30, 1:15] 注意 C 完全消失了
  3. A 与 D:以 A 为冲突区域: 保持A-NEW1 不变 添加到最终列表: D [1:15, 2:00](修改为 D)
  4. 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比较所示。我们有时需要创建一个“延续”事件,而原来的事件可能会被打断。

关于这个问题的任何想法,以及如何正确循环?

【问题讨论】:

    标签: algorithm sorting


    【解决方案1】:

    一种简单的方法可能是以基本的 15(或 5 或 1)分钟间隔拆分所有事件,然后解决每个切片上的冲突,最后合并指向同一事件的相邻切片。

    在这种情况下:

    12:00 find event A, A = [12:00-12:01]
    12:01 find event A, A = [12:00-12:02]
    ...
    12:15 find events A and B, B wins: B [12:15-12:16]
    12:16 find events A and B, B wins: B [12:15-12:17]
    12:30 find events A and C, A wins: A1 [12:30-12:31]
    ...
    13:00 find events A and D, A wins: A1 [12:30-13:01]
    ...
    13:14 find events A and D, A wins: A1 [12:30-13:15]
    13:15 find event D: D [13:15-13:16]
    ... 
    

    当“获胜”事件与“活动”活动相同时,您会延长活动活动。如果不是,则添加一个新事件;如果事件的标签(“A”)已被使用,则增加其计数器。

    因此,您需要保留“获胜”事件的队列,以及“已知”事件的列表及其计数器。

    【讨论】:

    • 太好了。在我的情况下,最小的单位是 5 分钟。谢谢
    • 如何实现find() 方法的问题也很有趣,它可能应该是二进制搜索而不是全扫描搜索,因为扫描所有现有事件以查找如果我的事件已经按 StartTime 预先排序,则给定时间范围。
    • @geneb。是的,一点没错。一旦你有一个排序的堆,你可以从最后一个事件恢复搜索,并在你“退出”当前事件的时间范围后立即停止。还有,如果你12:00到15:00只有一个事件,中间的5分钟都测试没意义,可以直接跳到15:00。我提出的算法非常幼稚且可优化。
    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2013-07-12
    相关资源
    最近更新 更多