是否有一种算法可以找到用于在O(nlogn)中调度n个类的最小教室数?

时间:2018-03-20 08:51:37

标签: algorithm time-complexity greedy

所以问题是:

我们有n个班级(n个区间),有开始时间和结束时间[si,fi],我们希望找到最小数量的教室,我们可以满足所有类别(间隔)而不会有任何勾结

我正在阅读的书中说我们可以在O(nlogn)中解决这个问题,但我找不到比O(n ^ 2)更好的算法

它说我们应该按照开始时间对它们进行排序,但是没有说出解决方案的其余部分,但这没有任何意义,因为在给每个班级一个房间之前,我们不应该检查所有其他间隔到看看我们是否有勾结?这使得O(n ^ 2)因为对于每个区间我们需要检查所有其他区间

我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

您可以按时间对事件(事件是类的开头或类的结尾)进行排序。这将需要O(n log n)。

现在,保留一堆空房间并按顺序浏览事件:

  • 对于每个开始事件从空堆栈中取出一个空间并将类分配给它。
  • 对于每个结束事件,将相应的房间放回空堆栈。

第二阶段可以在O(n)中完成。

通过跟踪已完成的分配和解除分配,您可以轻松找到所需房间的数量和时间表。

如果您只需要所需房间的数量,可以简化为使用柜台而不是房间列表。为每个开始事件添加一个,并为每个结束事件减1;跟踪最大值。

答案 1 :(得分:0)

第一步:存储课程'在actions数组中单独开始和结束点。如果该点是起始点,则type的{​​{1}}为action,如果它是某个类的结尾,则其+1type

第二步:按时间按升序对-1数组进行排序。如果时间相等,则按actions按升序排序。

第三步:将计数器设置为0,遍历type数组,如果它是启动类型则将1添加到计数器,如果是完成类型则从计数器减去1。同样,如果时间相等,则首先执行完成类型。因为在那个房间的课程结束后你就可以使用同一个教室。
计数器达到的最大值是你的答案。

以下是python中算法的实现:

actions