Определите, перекрываются ли диапазоны

Учитывая два события с целыми начальными и конечными временами, E1 = (s1, e1), E2 = (s2, e2), выполните быструю логическую проверку, чтобы увидеть, перекрываются ли события.

У меня есть решение, но мне любопытно посмотреть, что другие придумали.

EDIT: Хорошо, вот мое решение:

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

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

Ответ Фреда является кратким и правильным.

Я предпочитаю:

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

Я думаю, что это яснее, но это очень маленькая разница.

Переведено на английский:

Они перекрываются, если ни один из них не начинается до начала другого.


Это похоже на проблему перекрывающихся прямоугольников. Есть два хороших способа написать этот тест. Они соответствуют заявлениям:

Два прямоугольника перекрываются, если левый край обоих находится слева от правого края другого, а верхний край обоих - над нижним краем другого.

Два прямоугольника перекрываются, если ни один не находится слева или над другим.

Они перекрываются, если:

  • e1 между (включая обе конечные точки) s2 и e2 ИЛИ
  • e2 между (включая обе конечные точки) s1 и e1

Это также будет работать:

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

Я бы сделал это так:

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

(S2-S1) <(e1-s1) || (S1-S2) <(е2-с2)

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