Временная сложность добавления списка в список

#python

#python

Вопрос:

Я понимаю, что амортизированная сложность добавления элемента в список равна O (1), но какова временная сложность добавления списка в список?

Для пояснения:

Добавление элемента в список

 list_ = []  
for _ in range(0,n):  
    list_.append(1)
 

Добавление списка в список

 list_ = []
list_.append([_ for _ in range(0,n)])
 

Комментарии:

1. «добавление» списка в список по-прежнему равно O (1), вы просто добавляете ссылку в список, «расширение» списка размера m будет стоить вам O (m), поскольку для добавления каждого отдельного элемента необходимо пройти через другой список размера m

Ответ №1:

Еще раз ссылаясь на мой комментарий, «добавление» списка в список по-прежнему равно O (1), вы просто добавляете ссылку в список, «расширение» списка размера m будет стоить вам O (m), поскольку он должен пройти через другой список размера m, чтобыдобавьте каждый отдельный элемент.

 seq = [1, 2, 3]
new_seq = [4, 5, 6]

# Appending is O(1)
seq.append(new_seq)
print(seq) # [1, 2, 3, [4, 5, 6]]

seq = [1, 2, 3]
new_seq = [4, 5, 6]

# Extending is O(m), m = len(new_seq)
seq.extend(new_seq)

print(seq) #[1, 2, 3, 4, 5, 6]


list_ = []
list_.append([_ for _ in range(0,n)])
 

Для создания списка требуется O (n) времени [_ for _ in range(0,n)] , а затем O (1) времени, чтобы добавить ссылку на этот список в свой list_ . Всего O (n) для строки list_.append([_ for _ in range(0,n)]) .

Ответ №2:

Поскольку реализация .extend на самом деле лишь немного медленнее, чем добавление на месте, вы можете посмотреть источник .extend реализаций для ответа, например, здесь: https://github.com/python/cpython/blob/master/Objects/listobject.c

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

Ответ №3:

Ответ №4:

Если под «добавлением» вы подразумеваете, list.append(other_list) что сложность по-прежнему равна O (1), стоимость не меняется в зависимости от типа элемента.

В то время как, если вы имеете в виду конкатенацию на месте list.append(*other_list) , сложность равна O (n), где n — элементы второго списка.

Последний случай — это простая конкатенация list other_list , при которой вы создаете третий список, сложность равна O (m n), m и n — это два размера списков.