背景
前几天有一个任务是开发一个小型的排课系统,就是手动的输入一条一条课程信息。然后存入数据库中,项目其实很简单。在开发的过程中有一个值得思考的地方就是如何判断插入的新课程信息不会与别的课程重叠。例如,李老师在周一至周三都有课程安排,我如果插入的课程信息是安排李老师在周二到周四上课就会产生时间冲突。
解决思路
首先想到的是 #蛮力比较法#,把新增课程信息的开始时间和结束时间拿到数据库进行逐个比较,如果当前课程的开始时间在某一课程开始时间和结束时间之间,就会判定此课程不能安排。当然,对于结束时间也是如此,时间复杂度为O(n)也是可以接受的。
所以开始第二种方法:
在程序一开始,把数据库的数据读入到一个字典中,实现开始时间与结束时间的映射,同时对所有的时间进行排序,然后一次进栈,利用括号匹配的方法来匹配开始时间和结束时间,如果栈中的元素数量大于2,就表示时间有重叠。
总结
第二种方法虽然不是最优解,带式带来了优化的可能性。例如将列表和字典常驻内存(方法好笨啊哈哈哈哈哈啊哈),在时间复杂度方面会比第一个蛮力法高(主要是排序方法的选择上影响比较大)。