При работе с интервалами времени часто встает проблема определения их пересечения. Так как же максимально просто и правильно это определить?
Обычно начинающие программисты используют для этого избыточное количество условий.
На самом деле всё довольно просто. Попробуем разобраться на примере.
Дано два интервала:
- a1…a2
- b1…b2
Посмотрим сразу на формулу сравнения: a1<=b2 && a2>=b1
На вид всё просто, но на первый взгляд формула может показаться не логичной. Чтобы разобраться нужно пойти от обратного. Для этого необходимо написать условие для не пересекающихся интервалов:
a1>b2 ИЛИ a2<b1
Не пересекающиеся интервалы — это когда начало одного интервала больше конца другого интервала, или конец одного интервала меньше начала другого.
Тогда пересечение — это обратное от не пересечения:
НЕ (a1>b2 ИЛИ a2<b1)
Теперь осталось раскрыть скобки по правилам булевой алгебры и получим условие для проверки пересекающихся интервалов:
a1<=b2 И a2>=b1
В программном коде формула проверки пересекающихся периодов:
a1<=b2 && a2>=b1
Эта формула считает, что интервалы [1,5] и [5,10] будут пересекаться. Если требуется, чтобы исключить границы пересечена, то формула изменит вид на:
a1<b2 && a2>b1