Сложность времени с циклами while

Я не совсем уверен, понимаю ли я расчеты временной сложности. Мне даны эти петли, и это мои расчеты. Тем не менее, я не уверен, что сказать о больших O здесь.

Петля 1:

lst = [] i=1 while i<n: lst = list(range(i)) i *= 2 

Я предполагаю, что каждая операция занимает O (1) раз. В этом цикле 1-я строка и вторая строка выполняются 1 раз каждый. Первая строка цикла while содержит 3 операции – диапазон, список и назначение этого значения в lst. Поскольку мы имеем дело с диапазоном, я предполагаю, что он работает n + 1 раз.

Последняя строка цикла имеет 2 операции: умножение на 2 и присвоение этого значения i, и выполняется n раз.

Из этого я думаю, что общее число будет: 1 + 1 + 3 (n + 1) + 2n = 5n + 5.

Так как это линейная функция, то большой O будет O (n)?

===============

Петля 2:

 lst = [] i=1 while i<n: lst = lst + [i] i *= 2 

Здесь мы имеем аналогичный случай, однако первая строка цикла while имеет 2 операции. Затем,
1 + 1 + 2n + 2n = 4n + 2.

Так как это линейная функция, это тоже O (n)?

========================== Цикл 3:

 lst = [] i=1 while i<n: lst += [i] i *= 2 

Я думаю, что lst + = [i] будет выполнять 2 операции 2 раза, так как это вычисление на месте? Я не уверен в этом. Если это правильно, то общая сумма будет равна 6n + 2

Вопросы: я исчисляю эти права, или я совершенно не прав? Как написать большие O для каждого из этих циклов?

LOOP 1: O (n log n)

Loop запускает log2 (n) раз, его среднее значение O (log n). каждая итерация делает (в худшем случае) n действий. поэтому сложность O (n log n).

LOOP 2: O (log n)

Loop запускает log2 (n) раз, его среднее значение O (log n). Я полагаю, что назначение lst = lst + [i] просто добавляет узел (и не создает новый список). его среднее значение O (1), поэтому сложность O (log n). Если я ошибаюсь , назначение создает новый список, поэтому каждая итерация выполняет (в худшем случае) n действий. поэтому сложность O (n log n)

LOOP 3: O (log n)

Как и в цикле 2. Здесь назначение O (1) наверняка, а не предположение …