小编典典

计算重叠的日期范围时出现问题

algorithm

我在尝试制定出正确的算法来计算一组日期范围时遇到问题。

基本上,我有一个无序日期范围的列表(列表包含开始和结束时间的数组),并且我想合并此列表,因此它不包含重叠时间。

基本上要合并两个日期范围:

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

这将两个日期时间结合在一起。

当遍历所有值时,我遇到了一个绊脚石,因此结束列表仅包含不重叠的值。

我的函数式和递归编程有点生锈,欢迎任何帮助。


阅读 296

收藏
2020-07-28

共1个答案

小编典典

不要看间隔,只看它们的两端。

您有一堆开始时刻和一堆结束时刻。想象一下,开始时刻为红色,结束时刻为蓝色。或想象开始时刻是大括号,而结束时刻是大括号。

将它们放在列表中。将列表从最早到最新排序,忽略颜色。

现在随身携带一个设为零的计数器,然后向下移动列表。当您看到红色的瞬间时,请增加计数器。当您看到蓝色的瞬间时,请递减计数器。当计数器值从0变为1时,输出“开始”和当前时间。当计数器值从1变为0时,输出“结束”和当前时间。如果计数器值降至0以下,则输出“休斯顿,我们有问题”。您应该以0和一堆不错的非重叠间隔结尾计数器。

这是很好的旧括号计数算法。

插图。

 A bunch of overlapping intervals:

 (-------------------) 
                       (----------------------)           
                                                          (---)
       (---------------------)                       
                                                     (-----------------)

 A bunch of interval ends:

 (-----(-------------)-(-----)----------------)      (----(---)--------)
2020-07-28