java - 检查多个周期是否重叠的数据结构
问题描述
我有一个由和日期Period
表示的类,之后在哪里。我需要编写一个函数来检查周期是否重叠。start
end
end
start
直接的方法是检查每个周期与其他周期。有没有办法引入执行速度更快的数据结构?
class Period {
LocalDateTime start;
LocalDateTime end;
}
boolean isOverlap(Set<Period> periods) {
// TODO put the code here
}
isOverlap
true
当至少两个周期重叠时应该返回。
解决方案
每隔一个周期检查每个周期将具有 O(n 2 ) 时间复杂度。相反,我会按开始和结束时间对它们进行排序,然后遍历列表。这样,一个时期只能与它之前和之后的时期重叠(或在它之前或之后的多个后续时期 - 但这无关紧要,因为您正在寻找一个重叠来返回true
)。您可以遍历列表并检查它。该算法的总成本将是排序的成本,O(nlog(n)):
boolean isOverlap(Set<Period> periods) {
List<Period> sorted =
periods.stream()
.sorted(Comparator.comparing((Period p) -> p.start)
.thenComparing(p -> p.end))
.collect(Collectors.toList());
for (int i = 0; i < sorted.size() - 1; ++i) {
if (sorted.get(i).end.compareTo(sorted.get(i + 1).start) > 0) {
return true;
}
}
return false;
}
推荐阅读
- ios - 我在 Xamarin.Forms 中的 TableView 应该是灰色的吗?
- r - 如何仅选择 r 中数据框的每一年出现的个人
- r - 如何获取字符串,以及R中数据框中的字符串计数整个单词(TextMining)
- java - Spring @Repository 应该遵循 JpaRepository 吗?
- javascript - 如何给一个div添加一个类,不管是点击外层div还是内层div?
- python - 为什么当我使用无限while循环时pyqt5 GUI会冻结?
- java - 如何控制radio_botton中的选项数量?
- qt5 - QTcpSocket 不发出 connected()
- android - 如何在Android中检测后台发送的短信
- python - 从 Dict 打印特定数量的项目的方法