Как я могу быть уверен, что этот Python алгоритм использует постоянную память? Теоретическое доказательство в порядке.
Учебное пособие * имеет следующее упражнение: написать алгоритм для "поворота" списка из n целых чисел, другими словами, чтобы сместить значения списка на k индексы каждый. Суть в том, что алгоритм должен занимать линейное время (пропорциональное n ) и постоянную память (одинаковое количество для любого n ). Поворот можно выполнить с помощью нарезки:
>>> n = 5
>>> k = 3
>>> a = [i for i in range(n)]
>>> a = a[k:] + a[:k]
>>> a
[3, 4, 0, 1, 2]
Я проверил, что удвоение n удваивает время, необходимое, и поэтому этот алгоритм требует линейного времени. Однако я не уверен, что это требует постоянной памяти. Я предполагаю, что Python создает новый массив, который является объединением двух срезов, а затем переназначает переменную a
этому массиву. Если так, то я думаю, что используемая память пропорциональна n . Но как я могу это проверить?
Упражнение также дает мне подсказку, которая является крипти c: «Подсказка: поменять местами три подрешетки». Зачем нужно создавать три подмассива и зачем их менять? Это трюк с использованием постоянной памяти? Я понимаю, что вы можете изменить порядок элементов от 0 до k-1 , изменить порядок элементов k до n-1 затем измените порядок всех элементов в обратном порядке, но это похоже на большее количество операций, а не на меньшее.
* Книга Седжвика, Уэйна и Дондеро «Введение в программирование в Python». Я учу себя, а не беру курс за кредит.