Какая временная сложность вставки элемента в массив в Swift?

Ответ

Временная сложность зависит от позиции вставки:

  • Вставка в конец (append(_:)): O(1) в среднем (амортизированная). Swift использует динамический массив с запасом емкости (capacity). Если емкости достаточно, операция константна. При исчерпании емкости происходит переаллокация с копированием всех элементов (O(n)), но это случается редко, что дает амортизированную O(1).
  • Вставка в начало или середину (insert(_:at:)): O(n), где n — количество элементов. Все элементы после точки вставки необходимо сдвинуть.

Пример:

var numbers = [1, 2, 3, 4]
numbers.append(5) // O(1) (амортизированная)
numbers.insert(0, at: 0) // O(n), сдвигает элементы [1,2,3,4,5]

Практический совет: Для частых вставок в произвольные позиции рассмотрите другие структуры данных, например, связный список (O(1) для вставки при известном узле).

Ответ 18+ 🔞

А, ну это же классика, блядь! С массивами в Swift — как с очередью в столовой: в конец встать — раз плюнуть, а вот пролезть в середину — это уже пиздец какой-то.

Смотри, как оно работает, ёпта:

  • Впихнуть в самый хвост (append(_:)): Это O(1), если по-простому. Представь, у тебя есть шкаф с запасом полок. Пока полки есть — ты просто ставишь новую тарелку на следующую свободную, и всё, блядь. Быстро. Полки кончаются редко, а когда кончаются — приходится весь шкаф с тарелками переезжать на новый, побольше (это уже O(n)), но в среднем-то выходит быстро, амортизированно O(1), как говорят умники.

  • Впихнуть в начало или куда-то в середину (insert(_:at:)): А вот это уже O(n), сука! Потому что тебе надо не просто поставить, а раздвинуть все тарелки после точки вставки, чтобы место освободить. Чем массив длиннее и чем ближе к началу ты лезешь — тем больше тарелок придётся сдвигать. Полный пиздец для производительности.

Вот, глянь на примере, как это выглядит:

var numbers = [1, 2, 3, 4]
numbers.append(5) // O(1) — просто кинул пятёрку в конец, нихуя не сдвигая
numbers.insert(0, at: 0) // O(n) — вот тут начинается движ: пришлось все элементы [1,2,3,4,5] сдвинуть, чтобы нолик впихнуть в самое начало!

Так что практический совет, блядь: Если тебе надо постоянно совать элементы в разные места, как последний пидарас, то массив — это не твой выбор. Подумай о других штуках, типа связного списка — там, зная узел, вставить можно за O(1), не сдвигая всю эту ораву. А массив хорош, когда ты в основном работаешь с хвостом или по индексу быстро достаёшь.