Ответ
Временная сложность зависит от позиции вставки:
- Вставка в конец (
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), не сдвигая всю эту ораву. А массив хорош, когда ты в основном работаешь с хвостом или по индексу быстро достаёшь.