如何从日期范围集计算“Outersections”

时间:2017-04-24 16:05:25

标签: algorithm date-range set-theory

考虑一组日期范围:

enter image description here

A: [{2017/01/01, 2017/01/30},{2017/02/15, 2017/03/05},{2017/03/25, 2017/04/30}]

B: [{2017/01/01, 2017/01/30}]

C: [{2017/01/01, 2017/01/20},{2017/02/19, 2017/03/15}]

是否有一种有效的方法来计算“Outersection”间隔(阴影区域,A,B,C日期范围之间没有交叉点)?

编辑: @ kaidul-islam,谢谢你的回答! 我将逻辑简化为一个for和一个if

...
for (i; i < n - 1; i++) {
    var current := ranges[i];
    var next := ranges[i + 1];

    if (next.left > current.right) {
        gap := next.left - right
        if(gap > 0){
            result.add(gap)
        }
    }
}

我错过了什么?

PS:范围按左右日期排序。

1 个答案:

答案 0 :(得分:1)

按照左日期的升序排列所有范围集(ABC)(左侧位置的日期较小的范围将首先出现)。< / p>

然后按照这个伪代码:

result = []
left := range[0].left
right := range[0].right
i := 0
while(i < n):

   while(i + 1 < n && ranges[i + 1].left <= right):
       right := max(ranges[i + 1].right, right)
       i := i + 1
   end

   if(i + 1 < n):
       gap := ranges[i + 1].left - right
       if(gap > 0):
           result.add(gap)
       endif
   endif

end

return result

时间复杂度O(nlogn)用于排序,O(n)用于从左到右扫描,其中n是总计所有集合的范围总数。

如果您需要帮助,请告诉我。