Определить, перекрываются ли диапазоны - PullRequest
1 голос
/ 18 января 2011

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

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

РЕДАКТИРОВАТЬ: ОК, вот мое решение:

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

Ответы [ 9 ]

15 голосов
/ 18 января 2011

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

8 голосов
/ 18 января 2011

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

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

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

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

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

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


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

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


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

5 голосов
/ 18 января 2011

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

  • e1 между (включая обе конечные точки) s2 и e2 ИЛИ
  • e2 между (включая обе конечные точки) s1 и e1
4 голосов
/ 18 января 2011

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

max(s1, s2) < min(e1, e2)
2 голосов
/ 18 января 2011

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

return s1 < s2 ? s2 <= e1 : s1 <= e2;
1 голос
/ 19 марта 2013

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

0 голосов
/ 27 августа 2012

Вы можете проверить, в каких случаях оно не будет перекрываться

Условие отсутствия перекрытия: :: (s2> e1) ||(e2> s1) поэтому перекрытие равно! ((s2> e1) || (e2> s1))

0 голосов
/ 18 января 2011
(s2 < s1 && s1 < e2) || (s1 < s2 && s2 < e1)

или, что эквивалентно:

(s2 < s1 && s1 < e2) || (s2 < e1 && e1 < e2)
0 голосов
/ 18 января 2011
/* 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);
}
...