给定两个左闭右开时间段 [A, B)、[X, Y),如何判断它们是否有交集?

由于时间可以转换为时间戳,时间戳是一个数字,所以我们可以将问题转换为:如何判断两个左闭右开的数字区间是否有交集。

结论是如果 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 < 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')  # 当 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 = B,Y <= A 包含 Y= A,所以 B <= X 或 Y <= A,对其取反,得到有交集的情况:X < B AND A < Y

这里的证明是通过排列组合,获取了所有的情况,然后从整理所有没有交集的情况(更少的情况),然后推导出规律。

参考

  1. http://world.std.com/~swmcd/steven/tech/interval.html

转载于:https://www.cnblogs.com/jay54520/p/9405132.html

如何判断两个时间段是否有交集相关推荐

  1. java 判断两个时间段是不是有交集

    如上图:X Y  Z  分别为传来的开始时间可能位于数据库中时间段的位置. X有三种可能 即传来的开始时间为与数据可中某条数据的开始位置!       这样他的结束时间就有三种可能        1. ...

  2. SQL判断两个时间段是否存在交集

    场景: 数据库有有两个字段.开始时间,和结束时间,指定一个时间段(a,b),a表示开始时间,b表示结束时间.看数据库中有没有与(a,b)存在交集的时间段,有的话就返回那条记录. 分情形讨论 SQL: ...

  3. 判断两个时间段范围是否有交集

    前言 项目中经常会遇到判断两个时间段范围是否有交集,所以本文就记录下当时思考的过程和示例代码. 本文提供两种思路. 一.正向思维,求交集 以某个时间段为固定参考范围,然后有交集的情况共有以下四种情况分 ...

  4. 判断两个时间段交集、时间重叠问题

    判断两个时间段范围是否有交集(时间重叠)问题经常遇到,比如预约会议室开会,活动的开始结束等,本文做此分析. 前提:本文时间传参已做限制,结束时间必须大于开始时间 1.正向思维 代码如下 (oneSta ...

  5. java 时间段重叠_java 判断两个时间段是否重叠的案例

    java 判断两个时间段是否重叠的案例 发布时间:2020-10-21 16:08:51 来源:脚本之家 阅读:108 作者:SakuyaM 最近业务上遇到需要判断两个时间段是否存在重叠的情况,网上找 ...

  6. java里怎么判断时间重合_java 判断两个时间段是否重叠的案例

    最近业务上遇到需要判断两个时间段是否存在重叠的情况,网上找了不少代码.大佬们的思路过于简洁了,有些理解不了.还只是个菜鸟码农,还是多锻炼锻炼自己的思路. 思路很简单:定义一个时间段的概念,既然是时间段 ...

  7. 判断两个时间段是否重叠的算法

    判断两个时间段是否重叠,如: startdate1 - enddate1 startdate2 - enddate2 两个时间的重叠分4种情况,若你一一列出这四种情况来判断是否重叠那就弱爆了,最简单的 ...

  8. Java判断两个集合是否具有交集以及如何获得交集

    Java判断两个集合是否具有交集以及如何获得交集 一.Java判断两个集合是否具有交集 1.Collections.disjoint 2.CollectionUtils.containsAny 3.C ...

  9. Oracle判断两个时间段是否有重叠

    判断两个时间段是否有重叠 (a,b),(c,d) 判断两段时间是否有重叠 方法一 select 'yes' from dual where d>a  and c<b; 方法二 select ...

最新文章

  1. 设计模式之美:Facade(外观)
  2. Linux优化不知如何下手?那你的看看这篇文章了
  3. 日常生活中的法语积累2
  4. Python赋值、打包和解包,90%人不清楚的知识点!
  5. python 数据挖掘 简书_[Python数据挖掘入门与实践]-第一章开启数据挖掘之旅
  6. Spring系列(十一):@Profile 注解用法介绍
  7. 同步异步多线程这三者关系,你能给面试官一个满意的回答吗?
  8. Linux编程简介——VI
  9. FPGA设计中遇到的奇葩问题之“芯片也要看出身”
  10. 收集灵感必备|文字这样组合排版那才叫设计
  11. 为什么越来越少的人用 jQuery?
  12. JavaScript执行环境
  13. HTML5 开源游戏引擎 LayaAir
  14. Webservice 实践
  15. centos 卸载docker_五分钟安装docker并启动第一个docker容器
  16. ANSYS 有限元分析 接触分析
  17. 如何玩Chrome的小恐龙游戏
  18. MATLAB录制音频显示波形,并绘制其频谱
  19. css3实现图片划过一束光闪过效果(图片光影掠过效果)
  20. 2021-3-17 Jmeter线程组、运行启动方式

热门文章

  1. Kali 2017更新源
  2. 设置Tomcat管理员用户名和密码
  3. centos6.8升级python3.5.2
  4. RethinkDB创始人教你如何打造一个伟大的互联网产品
  5. 一个简单的单例模式的类
  6. ie6 下最佳 PNG透明方案【转】
  7. g2 折线图点与点之间直线_科学网—ggplot2实现散点折线图 - 肖斌的博文
  8. setjump和longjump
  9. b 树查找时间复杂度_你心里是没点B树吗?
  10. linux 升级 iphone,Linux 5.13 更新有望增加对苹果 M1 处理器的支持