确定范围是否重叠

时间:2011-01-17 21:18:28

标签: java c math boolean

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

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

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

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

9 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:8)

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

我更喜欢:

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

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

转换为英语:

  

如果两个都没有在另一个开始之前结束,它们会重叠。


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

  

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


  

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

答案 2 :(得分:5)

如果出现以下情况,它们会重叠:

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

答案 3 :(得分:4)

这也有效:

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

答案 4 :(得分:2)

我会这样做:

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

答案 5 :(得分:1)

(S2-S1)&lt;(e1-s1)|| (S1-S2)≤(E2-S2)

答案 6 :(得分:0)

/* 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);
}

答案 7 :(得分:0)

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

或等同于:

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

答案 8 :(得分:0)

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

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