Во-первых, давайте предположим, что у нас есть идеальная сборка мусора, и каждый список освобождается сразу после того, как он выходит из употребления.
При таком предположении алгоритмы имеют одинаковую сложность большого пространства O .
Алгоритм 2
Сначала взгляните на алгоритм 2 и рассмотрите следующий пример: представьте, что вы сортируете список длиной 16.
[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]
Вывычисляем первую и вторую половину списка:
[15,14,13,12,11,10,9,8] [7,6,5,4,3,2,1,0]
Затем вы сортируете первую половину, в частности, вы делите ее на два новых подсписка:
[15,14,13,12] [11,10,9,8]
И вы делаетеснова то же самое:
[15,14] [13,12]
И снова:
[15] [14]
Только тогда вы начинаете объединять списки.
Какова общая длина списков, выделенных алгоритмом в этой точке?
Это 16 + 2*8 + 2*4 + 2*2 + 2*1
.В общем, это N + 2N/2 + 2N/4 + 2N/8 + ... + 2
.Это простая геометрическая прогрессия, которая суммируется примерно в 3 * N.
Алгоритму также требуется место O (log (N)) для стека вызовов, но оно исчезает в большой записи O: O(N)
Легко видеть, что это максимум того, что алгоритм будет использовать в любой заданной точке - длина выделенных списков, которые будут использоваться в будущем (и не могут бытьиз-за этого) не будет превышать 3 * N.
Алгоритм 1
Рассмотрим тот же пример еще раз.Мы должны отсортировать следующий список.
[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]
Представьте, что мы уже отсортировали его первую и вторую половину:
[8,9,10,11,12,13,14,15, 0,1,2,3,4,5,6,7]
Теперь нам нужно выделить временный список длиныN, чтобы выполнить слияние.Поэтому в этот момент мы активно используем два списка длины N, что дает нам 2 * N = O (N).
Опять же, легко понять, что мы никогда не будем использовать больше памяти: задачасортировка половин списка, естественно, не может стоить дороже, чем сортировка самого списка.
Заключение
Оба алгоритма используют O (N) память.Они используют O (log (N)) для стека вызовов, но это незначительные затраты по сравнению с O (N).
Зная дополнительно, что Python использует подсчет ссылок для освобождения неиспользуемых объектов, проверяетнаше первоначальное предположение о сборке мусора.