如何判断两个时间段是否有交集
給定兩個左閉右開時間段 [A, B)、[X, Y),如何判斷它們是否有交集?
由于時間可以轉(zhuǎn)換為時間戳,時間戳是一個數(shù)字,所以我們可以將問題轉(zhuǎn)換為:如何判斷兩個左閉右開的數(shù)字區(qū)間是否有交集。
結(jié)論是如果 X < B AND A < Y,那么有交集,證明過程見下方。
數(shù)軸示意圖
這是一個不完善的、不容易思考的證明。
我將他們想象成數(shù)軸上的兩段:
-------A.------B。------X.-------Y。------“.” 表示閉區(qū)間,“。”表示開區(qū)間。然后令 [A, B) 不動,向左一直移動 [X, Y)。先是 X 進入 [A, B),然后是 X 離開 [A, B),Y 進入 [A, B)。所以只要 X 或 Y 在 [A, B) 間,那么兩者有交集。
上述算法遺漏了兩種情況,[X, Y) 完全在 [A, B) 中或者[A, B) 完全在 [X, Y) 中:
[X, Y) 完全在 [A, B):
-----A.-----X.----Y。----B。-----所以這種證明方法不好,雖然比較形象,但是因為變量太多,容易遺漏。
使用排列組合[1]
使用排列組合獲取所有的可能情況,并定義當(dāng)前數(shù)小于等于下一個數(shù)字(因為這樣定義就能包含所有的情況):
Python 代碼:
from itertools import permutationsfor x in list(permutations('ABXY')):# 由于 A < B,X < Y,所以 A 的位置一定在 B 前面,X 的位置一定在 Y 前面if x.index('A') < x.index('B') and x.index('X') < x.index('Y'):print(x)上方的輸出為:
('A', 'B', 'X', 'Y') # 因為 [A, B) 的最大值 < B 然后 B < X,然后 X 是 [X, Y) 的最小值,所以 [A, B) 的最大值小于 [X, Y) 的最小值,所以兩者無交集。 ('A', 'X', 'B', 'Y') # 當(dāng) X = B 時,無交集,其余情況有交集。 ('A', 'X', 'Y', 'B') # 有交集 ('X', 'A', 'B', 'Y') # 有交集 ('X', 'A', 'Y', 'B') # 當(dāng) A = Y 時,無交集,其余情況有交集 ('X', 'Y', 'A', 'B') # 無交集,與第一個的證明類似所以無交集的所有可能情況是,A <= B <= X <= Y、X = B、A = Y、X <= Y <= A <= B。由于 A < B、X < Y,所以只要 B <= X,那么 A <= X,所以 A <= B <= X <= Y 變?yōu)?B <= X <= Y,同理可得 X <= Y <= A <= B => Y <= A <= B。去除條件自帶的 A < B、X < Y 的情況后,為 B <= X、X = B、A = Y、Y <= A,由于 B <= X 包含 X = B,Y <= A 包含 Y= A,所以 B <= X 或 Y <= A,對其取反,得到有交集的情況:X < B AND A < Y。
這里的證明是通過排列組合,獲取了所有的情況,然后從整理所有沒有交集的情況(更少的情況),然后推導(dǎo)出規(guī)律。
參考
轉(zhuǎn)載于:https://www.cnblogs.com/jay54520/p/9405132.html
總結(jié)
以上是生活随笔為你收集整理的如何判断两个时间段是否有交集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Golang系列:打印命令行参数
- 下一篇: javascript 分时函数 分批次添