我在尝试制定出正确的算法来计算一组日期范围时遇到问题。
基本上,我有一个无序日期范围的列表(列表包含开始和结束时间的数组),并且我想合并此列表,因此它不包含重叠时间。
基本上要合并两个日期范围:
if start1 <= end2 and start2 <= end1 //Indicates overlap if start2 < start1 //put the smallest time in start1 start1 = start2 endif if end2 > end1 //put the highest time in end1 end1 = end2 endif endif
这将两个日期时间结合在一起。
当遍历所有值时,我遇到了一个绊脚石,因此结束列表仅包含不重叠的值。
我的函数式和递归编程有点生锈,欢迎任何帮助。
不要看间隔,只看它们的两端。
您有一堆开始时刻和一堆结束时刻。想象一下,开始时刻为红色,结束时刻为蓝色。或想象开始时刻是大括号,而结束时刻是大括号。
将它们放在列表中。将列表从最早到最新排序,忽略颜色。
现在随身携带一个设为零的计数器,然后向下移动列表。当您看到红色的瞬间时,请增加计数器。当您看到蓝色的瞬间时,请递减计数器。当计数器值从0变为1时,输出“开始”和当前时间。当计数器值从1变为0时,输出“结束”和当前时间。如果计数器值降至0以下,则输出“休斯顿,我们有问题”。您应该以0和一堆不错的非重叠间隔结尾计数器。
这是很好的旧括号计数算法。
插图。
A bunch of overlapping intervals: (-------------------) (----------------------) (---) (---------------------) (-----------------) A bunch of interval ends: (-----(-------------)-(-----)----------------) (----(---)--------)