确定范围是否重叠

给定具有整数开始和结束时间的两个事件,E1 =(s1,e1),E2 =(s2,e2),实现快速布尔检查以查看事件是否重叠。

我有解决方案,但我很想知道其他人想出了什么。

编辑:好的,这是我的解决方案:

e1 > s2 || (s1 > s2 && e2 < s1) 

bool overlap = (s1 <= e2) && (s2 <= e1)

弗雷德的答案既简洁又正确。

我更喜欢:

 bool overlap = !(e1 < s2 || e2 < s1); 

我认为这更清楚,但这是一个非常小的差异。

转换为英语:

如果两个都没有在另一个开始之前结束,


这类似于重叠矩形问题。 编写该测试有两种好方法。 它们对应于以下陈述:

如果两个矩形的左边缘位于另一个边缘的左边缘,则两个矩形重叠,两个矩形的顶边缘位于另一个边缘的上边缘之上。

如果两个矩形都不在左侧或在另一个上方,则两个矩形重叠。

它们重叠如果:

  • e1之间(包括两个端点) s2e2 OR
  • e2之间(包括两个端点) s1e1

这也有效:

 max(s1, s2) < min(e1, e2) 

我会这样做:

 return s1 < s2 ? s2 <= e1 : s1 <= e2; 

(S2-S1)<(e1-s1)|| (S1-S2)<(E2-S2)

 /* return true if intervals overlap */ bool overlap(unsigned int s1, unsigned int e1, unsigned int s2, unsigned int e2) { return (s1 >= s2 && s1 <= e2) || (e1 >= s2 && e1 <= e2) || (s2 >= s1 && s2 <= e1) || (e2 >= s1 && e2 <= e1); } 
 (s2 < s1 && s1 < e2) || (s1 < s2 && s2 < e1) 

或者,等效地:

 (s2 < s1 && s1 < e2) || (s2 < e1 && e1 < e2) 

您可以检查哪些情况不会重叠

没有重叠的条件是::(s2> e1)|| (e2> s1)所以重叠是!((s2> e1)||(e2> s1))