我目前面临着一个困难的排序问题。我有一组需要相互比较排序(比较排序)以及按其在列表中的相对位置排序的事件集合。
简单来说,我有一个事件列表,其中每个事件都有一个优先级(整数),持续时间(秒)和事件可以出现在列表中的最早时间。我需要根据优先级对事件进行排序,但是任何事件在其最早出现时间之前都不能出现在列表中。以下示例可以(希望能够)更清晰地说明:
// Psuedo C# code
class Event { int priority; double duration; double earliestTime ; }
void Example()
{
Event a = new Event { priority = 1, duration = 4.0, earliestTime = 0.0 };
Event b = new Event { priority = 2, duration = 5.0, earliestTime = 6.0 };
Event c = new Event { priority = 3, duration = 3.0, earliestTime = 0.0 };
Event d = new Event { priority = 4, duration = 2.0, earliestTime = 0.0 };
// assume list starts at 0.0 seconds
List<Event> results = Sort( new List<Event> { a, b, c, d } );
assert( results[ 0 ] == a ); // 4.0 seconds elapsed
assert( results[ 1 ] == c ); // 7.0 seconds elapsed
assert( results[ 2 ] == b ); // 12.0 seconds elapsed
assert( results[ 3 ] == d ); // 14.0 seconds elapsed
}
项目“b”必须最后出现,因为它不能在列表开始的6.0秒之前开始,所以它被推迟了,“c”可以在“b”之前执行,尽管其优先级较低。(希望上面的内容解释了我的问题,如果没有,请让我知道,我会进行编辑。)
我目前的想法是使用插入排序算法来管理排序过程。与许多其他常见的排序算法不同,插入排序算法逐个按顺序决定列表的顺序。因此,对于每个索引,我应该能够找到下一个最低优先级事件,其最早发生时间将得到满足。
我希望能够找到有关排序算法和数据结构的资源,以帮助我设计这种“排序”问题的好解决方案。我的实际问题比这个更复杂:分层排序、事件之间的可变缓冲区、多个非常数时间限制,因此获取更多信息或思路将更好。速度和空间并不重要,而对排序的准确性和代码的可维护性则很重要。
编辑:澄清(基于评论)
- 事件占用整个持续时间(即不允许事件重叠)
- 事件必须在其最早时间或之后发生,不能在其最早时间之前发生。
- 如果存在优先级较低的事件,则事件可以在其最早时间之后发生
- 事件不能被中断
- 列表中所有事件的持续时间总和有一个最大值。这在上面没有显示。(实际上,所有事件的持续时间将远大于时间列表的最大持续时间。)
- 不能有任何空隙。(没有任何漏洞可以尝试回填。)
编辑:答案
虽然David Nehme给出了我选择的答案,但我想指出,他的答案本质上是插入排序算法,而其他几个人提供了类似插入排序的答案。这对我来说证实了专门的插入排序可能是正确的方法。感谢所有人的答案。
列表中所有事件的总持续时间有一个最大值。>> 这是什么意思。一些事件将无法安排吗?
- David Nehme不能有任何间隙。(没有空洞可以尝试填补。)
你能保证这是可能的吗?例如,只有这两个事件。Event a = new Event { duration = 4.0, earliestTime = 0.0 };Event b = new Event {duration = 5.0, earliestTime = 6.0 }; - David Nehme