首先,这是一个讨论类型的建议问题。假设我有开始和结束时间的任务,当我创建新任务时,我想要检查时间是否与所有现有任务有效重叠。我目前正在使用的是什么 -
checkTaskTimeOverlapping (List<Task> existingTasks, Task newTask){
List<String> overlappingTimePeriods = new ArrayList<>();
for(Task existingTask : existingTasks) {
if( existingTask.beginTime < newTask.endTime && existingTask.endTime > newTask.beginTime) {
overlappingTimePeriods.add(existingTask.beginTime+ "-" + existingTask.endTime);
}
}
}
现在您可以看到,此算法使用O(N)复杂度来检查与N个现有任务重叠的时间。现在应该是一大堆任务,所以..我的问题是,有没有办法更好地优化这个算法来检查与现有任务重叠的时间,比如小于O(N)? 或者我应该保留现有的O(N)算法
答案 0 :(得分:3)
您可以将beginTasks按beginTime排序,并使用Collections.binarySearch获取插入新任务的索引,并与上一个和下一个任务进行比较。 那当然是O(log(N))