计算重叠日期范围的问题

时间:2011-09-19 09:38:47

标签: algorithm language-agnostic recursion functional-programming

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

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

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

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

这会加入两个日期时间。

在迭代所有值时遇到了绊脚石,所以结束列表只包含不重叠的值。

我的功能和递归编程有点生疏,欢迎任何帮助。

2 个答案:

答案 0 :(得分:15)

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

你有一堆开始时刻和一堆结束时刻。想象一下,起始时刻是红色,结束时刻是蓝色。或者想象一下,开始时刻是打开括号,结束时刻是关闭括号。

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

现在将一个计数器设置为零,然后沿着列表向下走。当你看到红色时刻时,递增计数器。当你看到一个蓝色的时刻,减少计数器。当计数器值从0变为1时,输出“start”和当前时间。当计数器值从1变为0时,输出“结束”和当前时间。如果计数器值低于0,则输出“休斯顿,我们遇到问题”。你应该用你的计数器结束0和一堆很好的非重叠间隔。

这是一个很好的旧支撑计数算法。

插图。

 A bunch of overlapping intervals:

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

 A bunch of interval ends:

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

答案 1 :(得分:0)

n.m.的答案就是你需要的所有答案,但是如果你想使用你已经制作的代码,那么只需按开始时间对范围进行排序,然后遍历列表合并重叠。