我发现了类似的问题,但没有一个考虑优先级。
R : (------------|xxxxxxx|ooo|xx|----------------) (---)
S1: (------------) (----------------) (---)
S2: (xxxxxxxxxxxxxxx) (xxxxxx)
S3: (ooooooo) (oo)
假设我有 3 个日期范围来源,名称分别为 S1、S2 和 S3,优先级分别为 1,2 和 3(1 是最高的)和结果 R。我需要结果是不重叠的日期范围,其中最高优先级优先。
我已经想到了一个解决方案,但它是相当连续的。首先,我创建一个按日期升序、优先级降序排列的表格(在日期冲突的情况下,表格中最高优先级排在第一位)及其 ID 和操作(打开或关闭范围):
ID | Action | Priority | Date |
--------------------------------
S1a | Open | 1 | 1 |
S2a | Open | 2 | 2 |
S1a | Close | 1 | 3 |
S3a | Open | 3 | 4 |
S2a | Close | 2 | 5 |
S2b | Open | 2 | 6 |
S3a | Close | 3 | 7 |
S1b | Open | 1 | 8 |
S2b | Close | 2 | 9 |
S3b | Open | 3 | 10 |
S3b | Close | 3 | 11 |
S1b | Close | 1 | 12 |
S1c...
然后我开始迭代这个表并填充一个有序列表和一个结果表:
所以第一行是:
Order List: Result:
ID | Priority | ID | Action | Date |
S1a| 1 | S1a| Open | 1 |
第二行,添加了 S2a 的开始日期,但没有写任何内容,因为表中存在更大的优先级:
Order List: Result:
ID | Priority | ID | Action | Date |
S1a| 1 | S1a| Open | 1 |
S2a| 2 |
第三行,关闭 S1a,写入关闭日期,由于 S2a 移动到列表顶部,它也写入了 S2a 的开放日期。
Order List: Result:
ID | Priority | ID | Action | Date |
x S1a| 1 | S1a| Open | 1 |
S2a| 2 | S1a| Close | 3 |
S2a| Open | 3 |
我想你可以看到这是怎么回事......很多交叉检查等,但在纸上它似乎工作。如果有人需要,我可以更好地解释该算法,但我认为这并不难理解。如果有序列表中有更高的优先级,则不写任何内容。当较高的优先级被删除时,下一个最大的将再次打开。
也许有人有更好、更具体的想法?
谢谢你的时间!