可能重複:
Determine Whether Two Date Ranges Overlap如果我有兩個時間段,我怎麼知道它們是否重疊?
說我有兩個對象,並且每個對象有一個日期範圍是它的結束日期和開始日期間,我怎麼找出如果兩個日期範圍之間以最有效或最快的方式重疊。
我想做到這一點使用.NET 3.5 C#
可能重複:
Determine Whether Two Date Ranges Overlap如果我有兩個時間段,我怎麼知道它們是否重疊?
說我有兩個對象,並且每個對象有一個日期範圍是它的結束日期和開始日期間,我怎麼找出如果兩個日期範圍之間以最有效或最快的方式重疊。
我想做到這一點使用.NET 3.5 C#
這是否是最有效最快捷的還是,我不確定,但是這是我會怎麼做。如果結果是瓶頸,那麼只有那時我纔會考慮進一步優化:
您確保第一個範圍在更早(或同時)開始時通過交換範圍(如有必要)。
然後,如果另一個範圍的開始小於或等於第一個範圍結束(如果範圍是包含的,包含開始和結束時間)或小於(如果範圍包括開始和結束時間不包括結束)。
在兩端假設以下,這裏只有四種可能性,其中一個是一個非重疊:
|----------------------| range 1
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 no overlap
2不進入它的範圍內的端點。所以,在僞代碼:
def doesOverlap (r1,r2):
if r1.s > r2.s:
swap r1, r2
if r2.s > r1.e:
return false
return true
如果範圍是在開始的包容性和排他性的盡頭,你就必須在第二個if
語句>=
更換>
:
|----------------------| range 1
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 no overlap
|---> range 2 no overlap
你大大限制了您必須進行的檢查次數,因爲您通過確保範圍1從不在範圍2後啓動,從而早日刪除一半問題空間。
檢查是否第二個對象的開始日期或結束日期在t他範圍內第一個對象:
bool overlap = (y.Start > x.Start && y.Start < x.End) || (y.End > x.Start && y.End < x.End);
x.Start:2001-01-01 ,x.Stop:2002-01-01,Y.Start:1999-01-01,Y.Stop:2001-06-01。你的函數返回false。正確的答案是正確的。 – Slartibartfast 2010-08-06 02:32:14
bollocks。謝謝。 – Femaref 2010-08-06 02:42:59
嘗試 - http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap – 2010-08-06 02:09:03