检测重叠周期的算法

我必须检测两个时间段是否重叠。

每个时期都有开始日期和结束日期。

我需要检测我的第一个时间段(A)是否与另一个(B / C)重叠。

在我的情况下,如果B的开始等于A的结束,它们不重叠(也是相反的)

我发现了以下情况:

在这里输入图像描述

所以其实我是这样做的:

tStartA < tStartB && tStartB < tEndA //For case 1
OR
tStartA < tEndB && tEndB <= tEndA //For case 2
OR
tStartB < tStartA  && tEndB > tEndA //For case 3

(在案例1或案例2中考虑了案例4)

可以工作 ,但似乎效率不高。

所以,首先是在c#中有一个现有的类,它可以对这个(一段时间)进行建模,类似于timepsan,但是具有固定的开始日期。

其次:是否已经有ac代码(如在Datetime类中)可以处理这个问题?

第三:如果不是的话,你会怎么做这个比较最快?


简单检查两个时间段是否重叠:

bool overlap = a.start < b.end && b.start < a.end;

或者在你的代码中:

bool overlap = tStartA < tEndB && tStartB < tEndA;

(如果你改变主意,想要说两个彼此接触的时段重叠,请使用<=而不是< )。


在CodeProject上有一个很好的评论库:http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET

这个库在重叠,交叉等方面做了很多工作。它太大而无法复制/粘贴,但是我会看到哪些特定的部分对您有用。


你可以创建一个可重复使用的Range模式类:

public class Range<T> where T : IComparable
{
    readonly T min;
    readonly T max;

    public Range(T min, T max)
    {
        this.min = min;
        this.max = max;
    }

    public bool IsOverlapped(Range<T> other)
    {
        return Min.CompareTo(other.Max) < 0 && other.Min.CompareTo(Max) < 0;
    }

    public T Min { get { return min; } }
    public T Max { get { return max; } }
}

您可以添加合并范围所需的所有方法,获取交点等...

链接地址: http://www.djcxy.com/p/54409.html

上一篇: Algorithm to detect overlapping periods

下一篇: Date Range Overlap with Nullable Dates