检测重叠周期的算法
我必须检测两个时间段是否重叠。
每个时期都有开始日期和结束日期。
我需要检测我的第一个时间段(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在案例1或案例2中被记入帐户)
它可以工作 ,但似乎效率不高。
所以,首先是在c#中有一个现有的类,可以对这个(一段时间)进行建模,类似于时间跨度,但是具有固定的开始日期。
其次:是否已经有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/87051.html