重叠的多个日期范围比较:如何有效地进行?
要检查两个不同日期范围内的重叠, {Start1, End1}
和{Start2, End2}
我正在检查:
if ((Start1 = Start2)) { //overlap exists }
问题是, 如果让我说五个日期范围,比较重叠的好方法是什么? 。
检查它们中的任何一个是否相互重叠?
如果我有多个日期范围,如何查找这些范围是否重叠?
找出是否所有都重叠
static bool Overlap(params Tuple[] ranges) { for (int i = 0; i < ranges.Length; i++) { for (int j = i + 1; j < ranges.Length; j++) { if (!(ranges[i].Item1 <= ranges[j].Item2 && ranges[i].Item2 >= ranges[j].Item1)) return false; } } return true; }
找出是否有重叠
static bool Overlap(params Tuple[] ranges) { for (int i = 0; i < ranges.Length; i++) { for (int j = i + 1; j < ranges.Length; j++) { if (ranges[i].Item1 <= ranges[j].Item2 && ranges[i].Item2 >= ranges[j].Item1) return true; } } return false; }
如果我理解正确,你想回答这个问题:这些范围中是否有两个重叠? 根据它们的左端对它们进行排序,然后查看是否1重叠2,如果2重叠3等,如果有任何重叠,这将找到它。 我不相信有任何方法可以在没有至少O(n log n)时间的情况下回答任意间隔列表的问题,这就是排序它们会花费你的成本。
或者,也许您想回答这个问题:这些范围中是否有两个不重叠? (从表面上看,这就是你编辑过的问题所要求的,但是(1)这似乎是一件奇怪的事情,并且(2)你上面的评论似乎表明它不是你的意思。)为了检查这一点,找到左边最右边的间隔和左边最右边的间隔,看它们是否重叠。 (如果你的两个间隔没有重叠,那么这两个不重叠。)
试试这个:
private bool intersects(DateTime r1start, DateTime r1end, DateTime r2start, DateTime r2end) { return (r1start == r2start) || (r1start > r2start ? r1start <= r2end : r2start <= r1end); }
DateTime h1 = historyRecord.serviceStartDate; DateTime h2 = historyRecord.serviceEndDate; DateTime r1 = record.serviceStartDate; DateTime r2 = record.serviceEndDate; if (!((h1 > r1 && h1 > r2 && h2 > r1 && h2 > r2) || (h1 < r1 && h1 < r2 && h2 < r1 && h2 < r2))) { count += 1; }
检查此算法以简要检测重叠周期 :
简单检查两个时间段是否重叠。
bool overlap = a.start < b.end && b.start < a.end;
或者在你的代码中......
bool overlap = tStartA < tEndB && tStartB < tEndA;