
1) 【一句话结论】课程排课的核心是采用贪心算法,结合最小优先级队列(时间堆),按课程开始时间排序后,为每个教师维护左闭右闭的空闲时间区间,通过技能匹配与时间完全覆盖(空闲结束时间≥课程结束时间)判断分配课程,并更新空闲时间为课程结束时间+预设间隔,避免时间冲突。
2) 【原理/概念讲解】课程排课属于资源分配优化问题,约束条件包括教师时间表、课程时间区间、教师技能匹配。贪心策略的核心是“局部最优选择”——每次为当前课程选择最早空闲且技能匹配的教师。具体实现:为每个教师维护一个最小堆(空闲时间队列),堆中元素按时间升序排列(左闭右闭区间,如[开始时间, 结束时间])。处理每个课程时,遍历所有教师,从其空闲时间堆中取出最早空闲时间。若教师技能集合包含课程要求的技能,且空闲结束时间≥课程结束时间(即时间完全覆盖,无冲突),则分配课程,更新空闲时间为课程结束时间+预设休息间隔(如课程时长+10分钟休息),通过堆的push操作插入新空闲时间,保持堆有序性。类比:就像为每个老师安排会议,先处理最早空闲时间,若会议时间不冲突且技能匹配,就安排,否则找下一个老师,最后更新老师的空闲时间(会议结束+休息时间),确保后续会议能正确安排。
3) 【对比与适用场景】
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 贪心算法 | 每步选择当前最优解(最早空闲时间),按课程开始时间排序,教师空闲时间用最小堆管理 | 时间复杂度O(n log m),空间复杂度O(m),高效处理大规模数据 | 课程数量多、时间冲突为主、教师技能匹配简单(如单一技能) | 可能存在局部最优导致全局最优不最优(如先排早课程占用后续老师时间) |
| 动态规划 | 记忆化搜索或递推,考虑所有子问题,计算所有可能的分配方案 | 时间复杂度O(n²)或更高,空间复杂度高 | 教师能力匹配复杂(如多技能教师、多课程协同)、约束条件多(如教师精力上限、课程优先级) | 适用于小规模问题或复杂约束,计算成本高 |
4) 【示例】假设课程列表按开始时间排序:C1: [1,3](数学课,技能:数学),C2: [2,4](英语课,技能:英语),C3: [3,5](数学课,技能:数学);教师T1: 技能{数学,英语},空闲时间堆:[0,2](数学)、[2,4](英语);T2: 技能{英语},空闲时间堆:[0,1]、[3,5]。
5) 【面试口播版答案】面试官您好,课程排课的核心思路是用贪心算法结合时间优先级队列。首先,按课程开始时间排序,为每个教师维护一个最小堆(空闲时间队列,按时间升序排列,左闭右闭区间)。处理每个课程时,遍历所有教师,从其空闲时间堆中取出最早空闲时间。检查教师是否具备课程要求的技能,并且空闲结束时间≥课程结束时间(即时间完全覆盖,无冲突)。若满足条件,就分配课程,更新空闲时间为课程结束时间加上预设的休息间隔(比如课程结束后有10分钟休息),通过堆的push操作插入新空闲时间。这样保证每次都给最早空闲且技能匹配的老师排课,避免时间冲突,时间复杂度约为O(n log m),n是课程数,m是教师数。
6) 【追问清单】
7) 【常见坑/雷区】