如何在x时间找到最大任务?

时间:2012-12-23 07:46:08

标签: algorithm

问题描述如下:

特定日期有n个事件有开始时间和持续时间。例如:

e1 10:15:06 11ms (ms = milli seconds)
e2 10:16:07 12ms
......

我需要找出时间x和n。其中x是执行最大事件的时间。

解决方案我在想: 在第d天扫描所有ms。但该要求总计86400000 * n计算。实施例

Check at 00::00::00::001 How many events are running
Check at 00::00::00::002 How many events are running
Take max of Range(00::00::00::01,00::00::00::00)

我想的第二个解决方案是:

For eventi in all events
   Set running_event=1
   eventj in all events Where eventj!=eventi
        if eventj.start_time in Range (eventi.start_time,eventi.execution_time)
           running_event++

然后取最大的running_event

有没有更好的解决方案?

2 个答案:

答案 0 :(得分:2)

这可以在O(n log n)时间内解决:

  • 制作所有活动的数组。此数组已经部分排序:O(n)
  • 对数组进行排序:O(n log n);你的图书馆应该能够利用部分排序(timSort做得非常好);查看distribution-based sorting algorithms以获得更好的预期运行时间。
    • 对事件边界进行排序w.r.t.边界时间
    • 如果触摸间隔被视为非重叠,则排序事件在排序开始之前结束 (如果触摸间隔被认为是重叠的,排序事件在排序开始后结束)
  • 初始化running = 0,running_best = 0,best_at = 0
  • 对于每个事件边界:
    • 如果是事件的开始,请递增running
    • 如果running > running_best,请设置best_at =当前事件时间
    • 如果它是事件的结束,则递减running
  • 输出best_at

答案 1 :(得分:0)

您可以通过仅检查所有间隔的结尾来减少检查的点数,对于从It1的每个间隔(任务)t2,您只需要检查t1t2处运行的任务数量(假设任务从t1运行到t2,如果是独占的,请检查t1-EPSILON, t1+EPSILON, t2-EPSILON, T2+EPSILON

很容易看到(说服自己为什么)你无法获得这些案例所没有的更好的东西。

示例:

tasks run in `[0.5,1.5],[0,1.2],[1,3]`
candidates: 0,0.5,1,1.2,1.5,3
0 -> 1 tasks
0.5 -> 2 tasks
1 -> 3 tasks
1.2 -> 3 tasks (assuming inclusive, end of interval)
1.5 -> 2 tasks (assuming inclusive, end of interval)
3 -> 1 task (assuming inclusive, end of interval)