Какова сложность пространства? - PullRequest
1 голос
/ 24 мая 2019

Я не уверен, какова сложность пространства следующей функции? Это O(n) или O(1)?

# Do rotation
def foo(arr):
    arr[:] = arr[5:] + arr[:5]

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

Каждый из arr[5:] и arr[:5] создает новый список, прежде чем присоединиться к другому новому списку, который будет назначен на arr на месте. И arr[5:], и объединенный список требуют O (n) по сложности пространства, поэтому общая сложность пространства составляет O (n) .

1 голос
/ 24 мая 2019

Это зависит от типа arr, но при условии, что это list, это O (n), так как оба среза в RHS создают новые list объекты, хотя и временно.Эти два конкатенируются в третий новый список, элементы которого затем копируются в существующий список, на который ссылается arr.

Вы можете достичь сложности пространства O (1), используя itertool.slice чтобы не делать копии:

def foo(arr):
    arr[:] = chain(islice(arr, 5, None), islice(arr, 5))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...