Деление на ноль

Динамический массив: интерактивная анимация (Dynamic Array)

Массив, который сам растет при заполнении

Визуализация

Сценарий: Рост массива
Сценарий:
Легенда цветов
пустая ячейка записано (push/insert) прочитано записано при сдвиге/копировании
Нажмите "Пуск" или листайте по шагам.
Размер: 0 Емкость: 2 Копирований: 0 Шаг: 0 / 0 Сложность по времени: -

Как работает динамический массив

Идея структуры: Массив фиксированной длины в оперативной памяти занимает непрерывный блок. Мы не можем просто "дописать" элемент в конец, если там уже лежат другие данные. Поэтому динамический массив выделяет память с запасом (это называется емкость). Когда запас исчерпывается, он выделяет новый, более крупный блок, копирует туда все элементы и удаляет старый блок.

Сложность

Сложность - это оценка того, как быстро растет потребление ресурса при росте числа элементов n. Ресурса у структуры два, поэтому и оценки две: по времени и по памяти. Обе записывают через O-нотацию - у нас есть отдельная анимация о том, как читать такие записи.

Динамический массив объединяет быстрый доступ по индексу с возможностью изменения длины.

По времени

Операция Сложность Комментарий
Доступ по индексу (get/set) O(1) Мгновенное вычисление адреса ячейки в памяти
Вставка в конец (push) O(1)* Амортизированно O(1). Худший случай O(n), если потребовалось перевыделение
Вставка в середину/начало O(n) Нужно сдвинуть все последующие элементы вправо
Удаление из конца (pop) O(1) Уменьшаем размер на 1 (обычно без сужения емкости)

По памяти

Характеристика Оценка Комментарий
Затраты по памяти O(n) Память выделяется непрерывным блоком. Из-за запаса емкости потребление памяти обычно в 1.5-2 раза больше фактического числа элементов

Свойства

Свойство Значение Комментарий
Организация памяти Непрерывная Элементы расположены в памяти строго друг за другом, обеспечивая отличную локальность кэша CPU.
Доступ по индексу O(1) Мгновенное обращение к любому элементу по индексу благодаря вычислению базового адреса.
Изменение емкости Амортизированное O(1) При заполнении массив выделяет новый блок большего размера и копирует существующие элементы.

Примеры реализации: Динамический массив (Dynamic Array)

Хотите разобрать тему глубже? В нашем бесплатном курсе есть урок про вектор, malloc и realloc - с подробной теорией, задачами и проверочными вопросами.