Я думаю, что этот подход был бы асимптотически очень эффективным для огромных наборов данных (d * u >> n), если они могут помещаться в памяти:
Если число дней равно d, количество пользователей равно u, а среднее число встреч на пользователя в день равно n, то это O (d * u * n), тогда как подход на основе сортировки по отдельным дням будет быть больше похожим на O (d * u * n * log n).
(Если u = 1 или d = 1, это не имеет значения - это не имеет значения.)
Создать массив списков, проиндексированных всеми
возможные временные интервалы. Например, если
Вы можете иметь временные интервалы каждые 5
минут, у вас будет массив
размер 120. Этот шаг O (1). Мы предполагаем, что количество возможных временных интервалов является фиксированным, и поэтому оно не должно иметь отношения к анализу сложности.
Прокрутка всех встреч, для всех дней и всех пользователей и добавление встреч (вместе с записью, для какого пользователя и дня) в соответствующий список для и времени начала и окончания встречи. Этот шаг - O (d * u * n), если вы используете связанный список и каждый раз добавляете их в начало списка.
Создайте массив для записи «текущего» свободного временного интервала для каждого дня и пользователя - вы увидите, как это работает на следующем шаге.
Цикл по первому массиву, и для каждого списка в массиве, цикл по этому списку (таким образом, циклы вложены). Для каждой встречи, которую вы видите как «завершить встречу сейчас», начните записывать новый свободный временной интервал в то время, для этого дня и пользователя. Для каждой встречи вы видите, что это «начало встречи сейчас», закончите записывать свободный временной интервал для того дня и пользователя, если таковые имеются, и отмените его, если оно имеет нулевую продолжительность - если его нет, и это не 8 утра, создайте один. Этот шаг также O (d * u * n).
Завершите все открытые записи свободного времени в 18:00. Этот шаг наихудший O (d * u).
Сравнение или поиск между встречами не требуется!
Это основано на сортировке по основанию.
Однако я не уверен, будет ли это лучше на практике . Это, безусловно, требует больше места!