Какой алгоритм использовать для поиска максимального пересечения множества отрезков?

Рейтинг: 5Ответов: 1Опубликовано: 01.10.2014

Есть задача:

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

Существует ли общеизвестный алгоритм для решения подобных задач?

Ответы

▲ 2Принят

Не уверен, что существует что-то типовое, но тут оптимальное решение более-менее очевидно.

На базе имеющихся данных сформируйте массив структур:

структура:
время (например, количество секунд с начала суток)
флаг (приход/уход)

O(n) - время формирования такой структуры (линейный проход по интервалам).
Затем отсортируйте эту структуру по времени. В общем случае сложность N*ln(N).

Заведите переменные "начало", "конец", "количество_посетителей" (p1), которые изначально установлены в 0.

Затем по отсортированному массиву двигайтесь от начала к концу, считая количество посетителей в локальную переменную (p2) (приход +1, уход -1, стартовое 0).

Каждый раз, когда p2 меняется, сравнивайте его с p1. Если больше, чем p1, в "начало" установите время текущего элемента массива, в "конец" -1, а в p1 установите p2. Если p2 станет меньше и "конец" = -1, запишите в "конец" время текущего элемента.
Когда пройдете по всему массиву O(n), Вы будете иметь время старта, время конца и количество людей в этот момент.

Сложность алгоритма получается N*ln(N) из-за стандартной сортировки.