问题描述
我有 6 个进程 P1、P2、P3、P4、P5 和 P6。我也在问题中给出了他们的开始时间和持续时间。
process# start duration
1 1 1
2 3 1
3 0 6
4 5 2
5 5 4
6 8 1
现在我必须找出完全不重叠进程的最大数量。如果一个进程在任何时间点都不与另一个进程重叠,则两个进程是完全不重叠的。
所以我做了一个甘特图,很容易看出答案是 4。
P1、P2、P4 和 P6 完全不重叠。
现在我必须编写一个程序来计算相同的值。在甘特图上,我可以轻松地“看到”解决方案。 在我的程序的算法中,我不知道如何最小化时间复杂度:目前我正在考虑采用每个进程并将其开始和结束时间与其他进程进行比较,但这大致使它成为 O(n^2) . 如果我将进程从 6 个扩展到 1000 个,则 O(n^2) 将花费大量时间。
是否有任何标准方法可以解决此类问题——我的意思是此类问题很容易形象化——比如甘特图?否则我如何使这个算法更好,有什么建议吗?
解决方法
您可以通过多种途径找到解决方案,以下是一些没有特定顺序的途径。
- 这已经是网络上的解决方案了吗?
最有可能的一点是,甘特图本质上是间隔。
- 会不会是图形问题?
假设每个区间都是一个节点,在 0(零)处成像一个起始节点,并将所有节点连接到晚于其结束的所有节点。使用 Dijkstra 或 A* 之类的方法找到解决方案。
- 会不会是动态规划问题?
有没有子问题,有,加或不加间隔,重复。
- 我知道用于此类问题的数据结构吗?
是的,Augmented Interval Tree 可以用来解决这个问题,也许吧。