Algorithm 时隙打包算法
我有一套活动的开始和结束时间。我想将它们渲染为一系列行中的长框,没有重叠,类似这样Algorithm 时隙打包算法,algorithm,combinatorics,Algorithm,Combinatorics,我有一套活动的开始和结束时间。我想将它们渲染为一系列行中的长框,没有重叠,类似这样 00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00 --|--------|--------|--------|--------|--------|--------|--------|--------|-- AAAAAAAAAAAA BBBBBB CCCCCCCCCCCCCCCCCC
00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00
--|--------|--------|--------|--------|--------|--------|--------|--------|--
AAAAAAAAAAAA BBBBBB CCCCCCCCCCCCCCCCCCCC DDDDDDDDDDDD
--|--------|--------|--------|--------|--------|--------|--------|--------|--
EEEEEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
--|--------|--------|--------|--------|--------|--------|--------|--------|--
GGGGGGGGGGGGGGGGGGG HHHHHHHH IIIIIIIIIIIII
--|--------|--------|--------|--------|--------|--------|--------|--------|--
将任何特定框指定给任何特定行并不重要。我想要的是一个算法,它将把这些框打包成最少的行
有一个已知的算法吗?我会贪婪地打包它们(从左到右,在适合的地方,从上到下向第一首曲目添加一个事件)。它速度快,确定性强,很可能在实践中产生良好的效果。我会贪婪地打包它们(从左到右,按照自上而下的方向在合适的地方向第一首曲目添加一个事件)。它速度快且具有确定性,在实践中很可能产生良好的效果。我用以下解决方案解决了相同的问题:
- 3.1找到适合该部门的最长要素李>
- 3.2.1如果有此类元件-嵌入线路中李>
- 3.2.2否则,很明显,该自由部门无法使用李>
请注意,插入元素(步骤3.2.1)时,枚举的自由扇区集(步骤3)将发生变化。我已使用以下解决方案解决了相同的问题:
- 3.1找到适合该部门的最长要素李>
- 3.2.1如果有此类元件-嵌入线路中李>
- 3.2.2否则,很明显,该自由部门无法使用李>
- 找出哪些日期彼此重叠。可能在地图中,您将每个条目映射到与其重叠的条目列表
- 按起始时间对元素进行排序
- 只要一行中有空格,就可以选择起始时间与最后一个元素结束时间最接近的元素李>
- 从与此元素重叠的所有元素中,选择与上一个元素重叠最多且与上一个元素不重叠的元素,并将其添加到行中李>
- 如果一行已满,请检查最大间隙,并查看是否有元素适合该行;否则请转到下一行
- 找出哪些日期彼此重叠。可能在地图中,您将每个条目映射到与其重叠的条目列表
- 按起始时间对元素进行排序
- 只要一行中有空格,就可以选择起始时间与最后一个元素结束时间最接近的元素李>
- 从与此元素重叠的所有元素中,选择与上一个元素重叠最多且与上一个元素不重叠的元素,并将其添加到行中李>
- 如果一行已满,请检查最大g
- 这称为间隔分区。贪婪算法按照开始时间的顺序分配盒子,并将盒子放入适合的第一行(如果盒子不适合任何地方,则打开一个新行),从而获得最佳结果。例如,参见Kleinberg&Tardos:“算法设计”。这称为区间划分。贪婪算法按照开始时间的顺序分配盒子,并将盒子放入适合的第一行(如果盒子不适合任何地方,则打开一个新行),从而获得最佳结果。例如,参见Kleinberg&Tardos:“算法设计”。如果我正确理解了您的问题,最重要的是找出哪些日期重叠。您没有说,该算法是否应该真正有效,或者是否应该适用于真正大的数据。因此,我建议采取以下步骤:
可能是通过重叠对元素进行加权,并在步骤5中进行最终检查。可能有助于改进正常的贪婪方法。如果我正确理解您的问题,最重要的是找出哪些日期重叠。您没有说,该算法是否应该真正有效,或者是否应该适用于真正大的数据。因此,我建议采取以下步骤: