给定开始/结束日期时间值的列表,我需要验证三件事:
- 对于每个间隔,开始时间在结束时间之前
- 列表元素之间不存在重叠,每个开始/结束跨度必须代表整个列表中的离散间隔
- 系列中不能有间隔,从最早的开始到最晚的结束,必须有连续的覆盖。
所以,给定:
( (1970-01-01, 1970-12-31), (1971-01-01, 1971-12-31), (1972-01-01, 1972-12-31), (1973-01-01, 1973-12-31) )
给出一个成功的结果。
给定
( (1970-12-31, 1970-01-01), (1970-10-01, 1971-12-31), (1972-01-01, 1972-12-31), (1973-01-01, 1973-12-31) )
提供一条消息,指出开始日期晚于第一个元素中的结束日期。
给定
( (1970-01-01, 1970-12-31), (1970-10-01, 1971-12-31), (1972-01-01, 1972-12-31), (1973-01-01, 1973-12-31) )
提供说明第一和第二元素之间存在重叠的消息。
给定
( (1970-01-01, 1970-12-31), (1971-10-01, 1971-12-31), (1973-01-01, 1973-12-31), (1974-01-01, 1974-12-31) )
提供一条消息,说明第二个和第三个元素之间存在间隙。
第一个要求很简单,问题是如何最好地将其纳入更广泛的验证。
下面的文章在一定程度上满足了第二个要求,但由于它仅适用于一对间隔,我仍然会意识到 O(n^2) 因为每个元素都需要与其他元素进行比较,对吗?确定两个日期范围是否重叠
这篇文章 -在区间列表中搜索区间重叠?- 似乎更好地解决了第二个要求,第一个可以滚动到区间树的种群中。
这样就剩下第三个要求了。是否可以使用区间树确定整个区间的间隙?
我会提到这是在 Javascript,node.js 中。然而,用 Haskell 或其他函数式语言解决这个问题会很有趣......
谢谢!
r/史蒂夫