Выбор ответа Junior Коллекции и строки спрашивают часто обновлено
Сложность append у Array в Swift
Вопрос
Какая сложность у array.append(x)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: O(1) амортизированно: изредка буфер растёт. Массив хранит элементы в непрерывном буфере с запасом ёмкости.
Варианты ответа
- Всегда O(n): массив копируется в новый буфер
- O(log n), как вставка в сбалансированное дерево
- O(1) всегда: буфер никогда не перевыделяется
- O(1) амортизированно: изредка буфер растётправильный ответ
Разбор
Массив хранит элементы в непрерывном буфере с запасом ёмкости. Пока место есть, добавление O(1). Когда ёмкость кончается, выделяется буфер примерно вдвое больше и элементы копируются: это O(n), но редкое, и в среднем на операцию выходит O(1). Если размер известен заранее, reserveCapacity убирает перевыделения. Отдельный случай: если буфер разделён с копией массива, первый append скопирует его из-за copy-on-write.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Коллекции и строки»
- Подсчёт частот в словаре
- Порядок ключей в Dictionary
- Сложность операций коллекций Swift
- String и NSString: длина и индексы
- Как взять n-й символ строки в Swift
- Сколько символов в строке с флагом
- Контракт Hashable в Swift
- Задача на Swift: сгруппировать анаграммы