2013-08-31 67 views
1

我有時間表可以從21:00到04:00。
大多數情況下,這些時間表可能會通過00:00小時標記。
現在我還必須添加從00:00到23:59的正常時間表。
我想計算相同的交點。
目前我使用24小時範圍交集邏輯

if(((mytime1.start_time <= mytime2.end_time) && (mytime2.start_time <= mytime1.end_time))). 

我還沒有對交叉口的有效證明傻瓜邏輯,當反式天時間表考慮,請幫助。

+1

請提供一個例子,說明你想要對間隔做什麼。 – Aravind

+0

不應該有兩個重疊的時間間隔說'兩個區間21:00至04:00和08:00至10:00'應該顯示爲不相交,而任何的'20:00至22:00或03:00至05:00「或者甚至完全重疊的時間表應該顯示衝突。總之,不應該有任何相交範圍。 –

+0

你比較之前,只需添加24〜'mytime2.start_time'和'mytime1.end_time'如果任一小於12.這樣就只要每個計劃是** **從來沒有超過24小時的工作。 – TheCodeArtist

回答

1
bool DoIntervalsOverlap(int s0, int e0, int s1, int e1) 
{ 
    return s0 - e0 <= (unsigned int) s0 - e1 || s1 - e1 <= (unsigned int) s1 - e0; 
} 

首先,請注意,實質上,所有的算術都是無符號的。在s0 - e0 <= (unsigned int) s0 - e1中,e1轉換爲unsigned int以匹配s0,並且s0 - e0轉換爲unsigned int以匹配(unsigned int) s0 - e1。下面,我假設所有的算術都是無符號的。

回想起來,我希望我已經按照相反的順序寫了條款。現在我們來解決這個問題。 s0 - e0 <= s0 - e1相當於e0 - s0 >= e1 - s0。 (這甚至在無符號運算是真實的。)現在,我們能想到的e0 - s0e1 - s0隨着時代E0E1轉換爲參考幀,其中S0是在原點。在此框架中,任何比原始s0早一天的時間已被包裝爲較大的正數。所以,午夜的包裝消失了。我們只有從s0開始的非負時間。於是我們看到,e0 - s0 >= e1 - s0被問「是E1,從S0測量,小於或等於E0?」這個問題就相當於「是E1內[S0E0] 」

因此,兩個條件詢問「E1內[S0E0]或是E0內[S1,e1]?「如果任一間隔在另一個間隔內結束,則間隔重疊。如果兩者都不在另一端,它們不會重疊。

+0

優雅的簡單... – TheCodeArtist

+0

'bool'是一個C++類型。這個問題被標記爲'C'。 – anthropomorphic

+1

@anthropomorphic:'bool'在C 1999和以後,當''被包括。 –

0

按順序考慮第一個時間間隔中的每個瞬間。如果這些時刻中沒有一個與第二時間間隔的開始一致,那麼這兩個時間間隔不相交,除非時間間隔已經與起點相交,在這種情況下,第一時間間隔中的第一時間將沿着第二時間間隔間隔。因此,如果開始和結束的第一個區間爲(l1,r1),第二個區間的開始和結束爲(l2,r1),我們可以通過查看l1是否包含在範圍[l2,r2]中以及是否包含l2來檢查在[l1,r1]的範圍內。如果lx在數字上不大於rx,那麼這是簡單的檢查以查看是否例如。 (l1> = l2)& &(l1 < = r2)。如果lx大於rx,那麼它是一個環繞間隔,你可以檢查是否(l2> = l1)|| (12< = r1)。