Определение пересечения периодов (числовых множеств)

Супер-пупер быстрая конкатенация(сложение) строк
Разность дат, а как быстрее?

На первый взгляд, довольно простая задачка для программиста, но как только приступаешь к её решению, начинается составление длинного логического выражения. Так как в алгебре логики имеется ряд законов, позволяющих производить равносильные преобразования логических выражений, то существует как минимум два логических выражения по определению пересечения периодов.

Допустим, имеется два периода:
1) НачалоПериода1 - КонецПериода1;
2) НачалоПериода2 - КонецПериода2.


Можно пойти от противного и составить логическое выражение по определению непересекаемости периодов с отрицанием:
Пересекаются = Не ((НачалоПериода2 > КонецПериода1) Или (КонецПериода2 < НачалоПериода1))

Другой тождественный вариант по определению пересекаемости периодов:
Пересекаются = (НачалоПериода2 < КонецПериода1) И (КонецПериода2 > НачалоПериода1);

Выглядит уже попроще, но существует еще один вариант решения данной задачи без использования логических операций.

Решение основано на функциях вычисления минимума и максимума, с последующим сравнением результатов:
Пересекаются = Макс(НачалоПериода1, НачалоПериода2) < Мин(КонецПериода1, КонецПериода2);

Логика такая: определяем большую дату из начальных дат периодов (максимум из минимумов), определяем меньшую дату из конечных дат периодов (минимум из максимумов), сравниваем даты. Если максимальная начальная дата меньше минимальной конечной даты, то периоды пересекаются.

Все вышеперечисленные варианты выражений справедливы по определению пересечения числовых множеств!

По результатам замера производительности последний вариант решения уступает первым примерно на 8-10% в скорости (см. рисунок 1).
Рисунок 1. Замер производительности
Обработку по определению пересечения периодов можно взять здесь.

Комментарии