典当行网站策划,北京展厅设计制作,推广比较好的网站,宝安做棋牌网站建设哪家技术好给定两个左闭右开时间段 [A, B)、[X, Y)#xff0c;如何判断它们是否有交集#xff1f; 由于时间可以转换为时间戳#xff0c;时间戳是一个数字#xff0c;所以我们可以将问题转换为#xff1a;如何判断两个左闭右开的数字区间是否有交集。 结论是如果 X B AND A 如何判断它们是否有交集 由于时间可以转换为时间戳时间戳是一个数字所以我们可以将问题转换为如何判断两个左闭右开的数字区间是否有交集。 结论是如果 X B AND A Y那么有交集证明过程见下方。 数轴示意图 这是一个不完善的、不容易思考的证明。 我将他们想象成数轴上的两段 -------A.------B。------X.-------Y。------“.” 表示闭区间“。”表示开区间。 然后令 [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] 使用排列组合获取所有的可能情况并定义当前数小于等于下一个数字因为这样定义就能包含所有的情况 Python 代码 from itertools import permutationsfor x in list(permutations(ABXY)):# 由于 A BX 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) # 当 X B 时无交集其余情况有交集。
(A, X, Y, B) # 有交集
(X, A, B, Y) # 有交集
(X, A, Y, B) # 当 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 变为 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 BY A 包含 Y A所以 B X 或 Y A对其取反得到有交集的情况X B AND A Y。 这里的证明是通过排列组合获取了所有的情况然后从整理所有没有交集的情况更少的情况然后推导出规律。 参考 http://world.std.com/~swmcd/steven/tech/interval.html转载于:https://www.cnblogs.com/jay54520/p/9405132.html