2010-08-06 91 views
2

可能重複:
Determine Whether Two Date Ranges Overlap如果我有兩個時間段,我怎麼知道它們是否重疊?

說我有兩個對象,並且每個對象有一個日期範圍是它的結束日期和開始日期間,我怎麼找出如果兩個日期範圍之間以最有效或最快的方式重疊。

我想做到這一點使用.NET 3.5 C#

+2

嘗試 - http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap – 2010-08-06 02:09:03

回答

1

這是否是最有效最快捷的還是,我不確定,但是這是我會怎麼做。如果結果是瓶頸,那麼只有那時我纔會考慮進一步優化:

您確保第一個範圍在更早(或同時)開始時通過交換範圍(如有必要)。

然後,如果另一個範圍的開始小於或等於第一個範圍結束(如果範圍是包含的,包含開始和結束時間)或小於(如果範圍包括開始和結束時間不包括結束)。

在兩端假設以下,這裏只有四種可能性,其中一個是一個非重疊:

|----------------------|  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後啓動,從而早日刪除一半問題空間。

-4

檢查是否第二個對象的開始日期或結束日期在t他範圍內第一個對象:

bool overlap = (y.Start > x.Start && y.Start < x.End) || (y.End > x.Start && y.End < x.End);

+0

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

+1

bollocks。謝謝。 – Femaref 2010-08-06 02:42:59

相關問題