问题描述如下:
特定日期有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
有没有更好的解决方案?
答案 0 :(得分:2)
这可以在O(n log n)
时间内解决:
O(n)
O(n log n)
;你的图书馆应该能够利用部分排序(timSort做得非常好);查看distribution-based sorting algorithms以获得更好的预期运行时间。
running
= 0,running_best
= 0,best_at
= 0 running
running > running_best
,请设置best_at
=当前事件时间running
best_at
答案 1 :(得分:0)
您可以通过仅检查所有间隔的结尾来减少检查的点数,对于从I
到t1
的每个间隔(任务)t2
,您只需要检查t1
和t2
处运行的任务数量(假设任务从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)