
Массив — фундаментальная структура данных, которая встречается во всех языках программирования. По сути это упорядоченный набор элементов одного типа (в строгих языках) или коллекция значений (в динамических языках). Понимание массива важно для эффективной работы с памятью и алгоритмами.
Ключевые свойства
- Индексация. Каждый элемент доступен по индексу. В большинстве языков индексация начинается с нуля.
- Последовательное хранение. В статических массивах элементы обычно размещаются подряд в памяти.
- Операции: доступ по индексу быстрый, вставка и удаление в середине медленнее.
Временные сложности (типично)
- Доступ по индексу: O(1)
- Поиск (линейный): O(n)
- Вставка/удаление в середине: O(n)
- Добавление в конец: O(1) амортизированно (для динамических массивов)
Статический и динамический массив
Статический массив имеет фиксированный размер, заданный при создании. Пример на C:
int a[5]; // пять элементов типа int
Динамический массив может изменять размер во время выполнения. В C++ это std::vector, в Java — ArrayList, в Python — list. Реализация динамического массива обычно использует выделение большего блока памяти и копирование при переполнении. Поэтому добавление в конец занимает O(1) амортизированно.
Примеры в разных языках
JavaScript — гибкий: массивы динамические и могут содержать разные типы.
let arr = [1, 'text', true];
arr.push(4); // добавить в конец
let x = arr[1]; // доступ по индексу
Python — list обеспечивает удобные операции: срезы, методы append и pop.
arr = [1, 2, 3]
arr.append(4)
sub = arr[1:3] # [2, 3]
Java — строгая типизация, есть массивы фиксированного размера и ArrayList.
int[] a = new int[5]; // статический массив
ArrayList list = new ArrayList();
list.add(10);
Многомерные массивы
Многомерные массивы хранятся по-разному в разных языках. В C двумерный массив обычно является блоком памяти, упорядоченным построчно. В языках с массивами массивов, например в Python, каждая строка — отдельный объект.
// C: плотная матрица 3x3
int m[3][3];
Типичные ошибки и ловушки
- Выход за границы. Самая частая ошибка в коде на низкоуровневых языках; приводит к неопределённому поведению.
- Неожиданное копирование. В некоторых языках присваивание массива копирует ссылку, а не данные; это ведёт к совместному доступу и побочным эффектам.
- Неправильное ожидание сложности. Вставка в середину динамического массива всё ещё O(n), несмотря на удобные методы.
Когда использовать массив
Выбирайте массив, когда нужен быстрый доступ по индексу и предсказуемая организация памяти. Если требуется частая вставка в середину, лучше рассмотреть связный список или другой контейнер. Для работы с большими объёмами числовых данных стоит обратить внимание на специализированные структуры и библиотеки, оптимизированные по памяти и скорости.
Короткая сводка
Массив прост по концепции, но его поведение зависит от языка и реализации. Быстрый доступ, простое представление и предсказуемая производительность делают массив первым инструментом при проектировании программ. Понимание ограничений позволит избежать многих ошибок и подобрать подходящую альтернативу в нужной задаче.