确定范围是否重叠
给定具有整数开始和结束时间的两个事件,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
之间(包括两个端点)s2
和e2
OR -
e2
之间(包括两个端点)s1
和e1
这也有效:
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))