Вы указываете только временную сложность, но также важно учитывать сложность пространства.
Сложность задачи можно указать в терминах N
(длина диапазона) и K
(количество пропущенных элементов).
В вопросе, который вы связываете, решение использования уравнений - это O (K) в пространстве (или, возможно, немного больше?), Так как вам нужно одно уравнение на неизвестное значение.
Существует также точка сохранения: можете ли вы изменить список известных элементов? В ряде случаев это нежелательно, и в этом случае любое решение, связанное с переупорядочением элементов или их потреблением, должно сначала сделать копию O (N-K) в пространстве.
Я не вижу быстрее линейного решения: вам нужно прочитать все известные элементы (N-K) и вывести все неизвестные элементы (K). Следовательно, вы не можете стать лучше, чем O (N) во времени.
Давайте разберем решения
- Уничтожение, O (N) пространство, O (N log N) время: сортировка по месту
- Сохранение, O (K) пространство?, O (N log N) время: система уравнений
- Сохранение, O (N) пробел, O (N) время: счетная сортировка
Лично, хотя я нахожу решение системы уравнений умным, я бы, вероятно, использовал одно из решений для сортировки. Посмотрим правде в глаза: их гораздо проще кодировать, особенно сортировку по счетам!
И что касается времени, то в реальном исполнении, я думаю, «счетная сортировка» превзойдет все остальные решения.
Примечание : для сортировки при подсчете не требуется, чтобы диапазон был [0, X)
, подойдет любой диапазон, поскольку любой конечный диапазон может быть перенесен в форму [0, X)
простым переводом.
EDIT
Изменил сортировку на O (N), для сортировки нужно иметь все элементы.
Когда у меня было время подумать над проблемой, у меня также есть другое решение. Как уже отмечалось, когда N увеличивается (резко), требуемое пространство может взорваться. Однако, если K мало, то мы можем изменить наше представление списка, используя интервалы:
можно представить как
В среднем случае поддержание отсортированного списка интервалов обходится намного дешевле, чем обслуживание отсортированного списка элементов, и также легко вывести недостающие числа.
Временная сложность проста: O (N log N), в конце концов это в основном вставная сортировка.
Конечно, что действительно интересно, так это то, что на самом деле нет необходимости сохранять список, поэтому вы можете передать его потоку алгоритму.
С другой стороны, мне довольно сложно вычислить среднюю сложность пространства. «Конечное» занимаемое пространство - это O (K) (не более K + 1 интервалов), но во время построения будет гораздо больше пропущенных интервалов, поскольку мы вводим элементы в произвольном порядке.
Худший случай достаточно прост: N / 2 интервалов (думаю, что нечетные против четных чисел). Однако я не могу понять средний случай. Мое инстинктивное чувство говорит мне, что это должно быть лучше, чем O (N), но я не настолько доверчив.