Какова сложность добавления элемента в конец буфера в памяти в Swift?

«Какова сложность добавления элемента в конец буфера в памяти в Swift?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Амортизированная сложность O(1).

  • Если в буфере (Array, Data, ContiguousArray) достаточно емкости (capacity), операция append(_:) выполняется за константное время.
  • Если места нет, происходит реаллокация с выделением большего блока памяти и копированием всех существующих элементов — операция O(n). Однако стратегия роста емкости (обычно удвоение) делает такие дорогостоящие операции редкими, обеспечивая амортизированную O(1).

Пример:

var buffer = [1, 2, 3] // Начальная емкость может быть 3 или больше
buffer.append(4) // O(1), если capacity >= 4

Нюансы:

  • ContiguousArray гарантирует O(1) для append, когда есть свободная емкость, так как элементы хранятся в непрерывной области памяти.
  • Data ведет себя аналогично Array.
  • Для буферов фиксированного размера (например, UnsafeMutableBufferPointer) операция добавления не предусмотрена — требуется ручное управление памятью.