Выбор ответа Junior Коллекции и строки спрашивают часто обновлено

Сложность append у Array в Swift

Вопрос

Какая сложность у array.append(x)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: O(1) амортизированно: изредка буфер растёт. Массив хранит элементы в непрерывном буфере с запасом ёмкости.

Варианты ответа

  1. Всегда O(n): массив копируется в новый буфер
  2. O(log n), как вставка в сбалансированное дерево
  3. O(1) всегда: буфер никогда не перевыделяется
  4. O(1) амортизированно: изредка буфер растётправильный ответ

Разбор

Массив хранит элементы в непрерывном буфере с запасом ёмкости. Пока место есть, добавление O(1). Когда ёмкость кончается, выделяется буфер примерно вдвое больше и элементы копируются: это O(n), но редкое, и в среднем на операцию выходит O(1). Если размер известен заранее, reserveCapacity убирает перевыделения. Отдельный случай: если буфер разделён с копией массива, первый append скопирует его из-за copy-on-write.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.