2011-02-06 67 views
9

如果要在兩個不同的dateranges,{Start1, End1}{Start2, End2}我檢查檢查是否出現重疊:多重日期範圍比較重疊:如何有效地做到這一點?

if ((Start1 <= End2) && (End1 >= Start2)) 
{ 
    //overlap exists 
} 

的問題是, 是什麼,如果我不得不讓我們覺得五個dateranges比較重疊的好辦法?

檢查,看看是否有任何人不互相重疊?

如果我有多個日期範圍,如何找到,如果這個範圍內是重疊的?

+3

你需要知道,如果他們都在1點重疊或其中的任何不相互重疊? – 2011-02-06 00:18:05

+1

請澄清你的問題。 「比較重疊」是什麼意思? – 2011-02-06 00:18:51

+0

@Yuriy Faktorovich,@gaearon:夥計們,我編輯了這個問題。基本上,我只想知道是否存在重疊,如果我有任何順序的多個日期範圍。 – VoodooChild 2011-02-06 00:26:28

回答

13

找到,如果所有的重疊

static bool Overlap(params Tuple<DateTime, DateTime>[] 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<DateTime, DateTime>[] 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; 
} 
4

如果我理解正確的話,要回答這個問題:是否有這些範圍重疊的任何兩個?根據自己的左手端對它們進行排序,然後經過看看是否重疊1 2,如果2重疊3等,如果有任何重疊,這就會找到它。我不相信有任何方法可以在沒有至少O(n log n)時間的情況下爲任意間隔列表回答你的問題,這就是排序它們會花費你的時間。

或者,您可能想回答以下問題:不存在重疊的這些範圍中是否有任何兩個範圍? (在它的臉就是你編輯的問題是問,但(1)這似乎是一個奇怪的事情想和(2)以上的評論似乎表明,這是你的意思是不是。)要檢查這一點,找到最左端的間隔和最右端的間隔,看它們是否重疊。 (如果你的時間間隔中的任意兩個不重疊,這兩個不知道。)

1
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; 
     } 
2

試試這個:

private bool intersects(DateTime r1start, DateTime r1end, 
          DateTime r2start, DateTime r2end) 
    { 
     return (r1start == r2start) 
      || (r1start > r2start ? 
       r1start <= r2end : r2start <= r1end); 
    } 
0

檢查這個Algorithm to detect overlapping periods 簡要:

簡單的檢查,看看兩個時間段重疊。

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

或者在你的代碼...

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