1 added
1 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Массив - это структура данных и тип составной переменной, предназначенный для хранения упорядоченного набора однотипных элементов в непрерывной области памяти. Каждый элемент массива доступен по индексу, что обеспечивает предсказуемое время доступа к данным. В отличие от списков и связных структур массив ориентирован на быстрый прямой доступ, а не на вставку или удаление в произвольной позиции.</p>
1
<p>Массив - это структура данных и тип составной переменной, предназначенный для хранения упорядоченного набора однотипных элементов в непрерывной области памяти. Каждый элемент массива доступен по индексу, что обеспечивает предсказуемое время доступа к данным. В отличие от списков и связных структур массив ориентирован на быстрый прямой доступ, а не на вставку или удаление в произвольной позиции.</p>
2
<h2>Отличие массивов от списков и других контейнеров</h2>
2
<h2>Отличие массивов от списков и других контейнеров</h2>
3
<p>Список в широком смысле описывает упорядоченный набор элементов без жесткого требования к способу хранения. В конкретных языках под списком могут понимать связный список, динамический массив или абстрактный последовательный контейнер. Массив же предполагает:</p>
3
<p>Список в широком смысле описывает упорядоченный набор элементов без жесткого требования к способу хранения. В конкретных языках под списком могут понимать связный список, динамический массив или абстрактный последовательный контейнер. Массив же предполагает:</p>
4
-
<ul><li><p>не��рерывное размещение элементов в памяти;</p>
4
+
<ul><li><p>непрерывное размещение элементов в памяти;</p>
5
</li>
5
</li>
6
<li><p>фиксированный размер или размер, меняющийся только через переразмещение;</p>
6
<li><p>фиксированный размер или размер, меняющийся только через переразмещение;</p>
7
</li>
7
</li>
8
<li><p>доступ к элементу по целочисленному индексу;</p>
8
<li><p>доступ к элементу по целочисленному индексу;</p>
9
</li>
9
</li>
10
<li><p>одинаковый тип хранимых значений на уровне реализации.</p>
10
<li><p>одинаковый тип хранимых значений на уровне реализации.</p>
11
</li>
11
</li>
12
</ul><p>Благодаря этим свойствам массив используется как базовый строительный блок оптимизированных алгоритмов.</p>
12
</ul><p>Благодаря этим свойствам массив используется как базовый строительный блок оптимизированных алгоритмов.</p>
13
<h2>Типы и виды массивов</h2>
13
<h2>Типы и виды массивов</h2>
14
<p>Классификация массивов опирается на размерность, поведение длины и однородность хранимых данных.</p>
14
<p>Классификация массивов опирается на размерность, поведение длины и однородность хранимых данных.</p>
15
<h3>Одномерные и многомерные</h3>
15
<h3>Одномерные и многомерные</h3>
16
<p>Одномерный массив представляет собой линейную последовательность элементов. Индекс однозначно определяет позицию в этом ряду.</p>
16
<p>Одномерный массив представляет собой линейную последовательность элементов. Индекс однозначно определяет позицию в этом ряду.</p>
17
<p>Многомерный массив задает элементы в виде таблицы или гиперкуба. Для двумерного массива используются два индекса: номер строки и номер столбца. Для трехмерного и выше - дополнительное количество индексов. С точки зрения реализации применяются:</p>
17
<p>Многомерный массив задает элементы в виде таблицы или гиперкуба. Для двумерного массива используются два индекса: номер строки и номер столбца. Для трехмерного и выше - дополнительное количество индексов. С точки зрения реализации применяются:</p>
18
<ul><li><p>массив массивов (каждый элемент первого измерения хранит ссылку на отдельный подмассив);</p>
18
<ul><li><p>массив массивов (каждый элемент первого измерения хранит ссылку на отдельный подмассив);</p>
19
</li>
19
</li>
20
<li><p>сплошной блок памяти с вычислением смещений по формуле индексации.</p>
20
<li><p>сплошной блок памяти с вычислением смещений по формуле индексации.</p>
21
</li>
21
</li>
22
</ul><p>Многомерные массивы используются при работе с изображениями, матрицами, сеточными моделями.</p>
22
</ul><p>Многомерные массивы используются при работе с изображениями, матрицами, сеточными моделями.</p>
23
<h3>Статические и динамические</h3>
23
<h3>Статические и динамические</h3>
24
<p>Статический массив имеет размер, определенный на этапе объявления и неизменный в ходе выполнения программы. Преимущество такой структуры - предсказуемые затраты памяти и отсутствие накладных расходов на перераспределение.</p>
24
<p>Статический массив имеет размер, определенный на этапе объявления и неизменный в ходе выполнения программы. Преимущество такой структуры - предсказуемые затраты памяти и отсутствие накладных расходов на перераспределение.</p>
25
<p>Динамический массив поддерживает изменение емкости во время работы программы. При добавлении элементов при переполнении текущего блока памяти он:</p>
25
<p>Динамический массив поддерживает изменение емкости во время работы программы. При добавлении элементов при переполнении текущего блока памяти он:</p>
26
<ul><li><p>выделяет новый блок большего размера;</p>
26
<ul><li><p>выделяет новый блок большего размера;</p>
27
</li>
27
</li>
28
<li><p>копирует существующие элементы;</p>
28
<li><p>копирует существующие элементы;</p>
29
</li>
29
</li>
30
<li><p>освобождает старый блок.</p>
30
<li><p>освобождает старый блок.</p>
31
</li>
31
</li>
32
</ul><p>Как правило, увеличение размеров происходит не на один элемент, а кратно, что снижает средние накладные расходы. Динамические массивы используются как универсальный контейнер последовательных данных.</p>
32
</ul><p>Как правило, увеличение размеров происходит не на один элемент, а кратно, что снижает средние накладные расходы. Динамические массивы используются как универсальный контейнер последовательных данных.</p>
33
<h3>Однородные и гетерогенные</h3>
33
<h3>Однородные и гетерогенные</h3>
34
<p>Классический массив хранит элементы одного типа - целые числа, числа с плавающей точкой, структуры фиксированного формата. Это упрощает адресацию и вычисление смещений, а также позволяет эффективно использовать кэш процессора.</p>
34
<p>Классический массив хранит элементы одного типа - целые числа, числа с плавающей точкой, структуры фиксированного формата. Это упрощает адресацию и вычисление смещений, а также позволяет эффективно использовать кэш процессора.</p>
35
<p>В ряде языков допускаются гетерогенные массивы, содержащие значения разных типов. В таком случае элементы фактически представляют собой ссылки на объекты. Это повышает гибкость, но снижает эффективность и усложняет статический анализ типов.</p>
35
<p>В ряде языков допускаются гетерогенные массивы, содержащие значения разных типов. В таком случае элементы фактически представляют собой ссылки на объекты. Это повышает гибкость, но снижает эффективность и усложняет статический анализ типов.</p>
36
<h2>Операции над массивами</h2>
36
<h2>Операции над массивами</h2>
37
<p>Набор базовых операций с массивом включает инициализацию, модификацию содержимого, обращение по индексу и линейный обход. Конкретный синтаксис зависит от языка, но общая логика одинакова.</p>
37
<p>Набор базовых операций с массивом включает инициализацию, модификацию содержимого, обращение по индексу и линейный обход. Конкретный синтаксис зависит от языка, но общая логика одинакова.</p>
38
<h3>Создание и инициализация</h3>
38
<h3>Создание и инициализация</h3>
39
<p>При создании массива задают:</p>
39
<p>При создании массива задают:</p>
40
<ul><li><p>тип элементов;</p>
40
<ul><li><p>тип элементов;</p>
41
</li>
41
</li>
42
<li><p>размер (для статического массива);</p>
42
<li><p>размер (для статического массива);</p>
43
</li>
43
</li>
44
<li><p>начальные значения или правило инициализации.</p>
44
<li><p>начальные значения или правило инициализации.</p>
45
</li>
45
</li>
46
</ul><p>Возможны варианты: заполнение значением по умолчанию, перечисление литералов, создание пустого динамического массива с нулевой длиной и заданной или автоматически подбираемой емкостью.</p>
46
</ul><p>Возможны варианты: заполнение значением по умолчанию, перечисление литералов, создание пустого динамического массива с нулевой длиной и заданной или автоматически подбираемой емкостью.</p>
47
<h3>Доступ, изменение и удаление элементов</h3>
47
<h3>Доступ, изменение и удаление элементов</h3>
48
<p>Доступ к элементу осуществляется по индексу. Операция обращения имеет постоянную асимптотическую сложность O(1) при условии непрерывного размещения.</p>
48
<p>Доступ к элементу осуществляется по индексу. Операция обращения имеет постоянную асимптотическую сложность O(1) при условии непрерывного размещения.</p>
49
<p>Над элементами выполняют:</p>
49
<p>Над элементами выполняют:</p>
50
<ul><li><p>чтение значения по индексу;</p>
50
<ul><li><p>чтение значения по индексу;</p>
51
</li>
51
</li>
52
<li><p>запись нового значения;</p>
52
<li><p>запись нового значения;</p>
53
</li>
53
</li>
54
<li><p>логическое удаление с установкой специального маркера;</p>
54
<li><p>логическое удаление с установкой специального маркера;</p>
55
</li>
55
</li>
56
<li><p>физическое удаление со сдвигом последующих элементов.</p>
56
<li><p>физическое удаление со сдвигом последующих элементов.</p>
57
</li>
57
</li>
58
</ul><p>Удаление и вставка в середину статического или динамического массива требуют сдвига части элементов и имеют линейную сложность O(n). Поэтому массивы менее удобны для частых локальных вставок и удалений по сравнению со связанными списками.</p>
58
</ul><p>Удаление и вставка в середину статического или динамического массива требуют сдвига части элементов и имеют линейную сложность O(n). Поэтому массивы менее удобны для частых локальных вставок и удалений по сравнению со связанными списками.</p>
59
<h3>Перебор массива</h3>
59
<h3>Перебор массива</h3>
60
<p>Последовательный обход элементов используется:</p>
60
<p>Последовательный обход элементов используется:</p>
61
<ul><li><p>для вычисления агрегатов (сумма, минимум, максимум);</p>
61
<ul><li><p>для вычисления агрегатов (сумма, минимум, максимум);</p>
62
</li>
62
</li>
63
<li><p>для фильтрации и преобразования данных;</p>
63
<li><p>для фильтрации и преобразования данных;</p>
64
</li>
64
</li>
65
<li><p>для поиска по условию.</p>
65
<li><p>для поиска по условию.</p>
66
</li>
66
</li>
67
</ul><p>Перебор чаще всего реализуется циклом с индексом или итератором. Асимптотическая сложность - O(n).</p>
67
</ul><p>Перебор чаще всего реализуется циклом с индексом или итератором. Асимптотическая сложность - O(n).</p>
68
<h2>Применение в алгоритмах</h2>
68
<h2>Применение в алгоритмах</h2>
69
<p>Массивы лежат в основе большого числа классических алгоритмов. Они обеспечивают быстрый произвольный доступ и плотное представление данных.</p>
69
<p>Массивы лежат в основе большого числа классических алгоритмов. Они обеспечивают быстрый произвольный доступ и плотное представление данных.</p>
70
<h3>Поиск и сортировка</h3>
70
<h3>Поиск и сортировка</h3>
71
<p>Линейный поиск по массиву последовательно сравнивает элементы с искомым значением. Он прост в реализации, но имеет сложность O(n). При предварительной сортировке массива возможно применение двоичного поиска с логарифмической сложностью O(log n).</p>
71
<p>Линейный поиск по массиву последовательно сравнивает элементы с искомым значением. Он прост в реализации, но имеет сложность O(n). При предварительной сортировке массива возможно применение двоичного поиска с логарифмической сложностью O(log n).</p>
72
<p>Большинство алгоритмов сортировки, таких как быстрая сортировка, сортировка слиянием, пирамидальная сортировка, реализуются поверх массивов. Структура позволяет:</p>
72
<p>Большинство алгоритмов сортировки, таких как быстрая сортировка, сортировка слиянием, пирамидальная сортировка, реализуются поверх массивов. Структура позволяет:</p>
73
<ul><li><p>быстро обменивать элементы местами;</p>
73
<ul><li><p>быстро обменивать элементы местами;</p>
74
</li>
74
</li>
75
<li><p>обращаться к произвольным индексам при разбиении;</p>
75
<li><p>обращаться к произвольным индексам при разбиении;</p>
76
</li>
76
</li>
77
<li><p>хранить результат сортировки на месте без дополнительных структур.</p>
77
<li><p>хранить результат сортировки на месте без дополнительных структур.</p>
78
</li>
78
</li>
79
</ul><h3>Примеры кода</h3>
79
</ul><h3>Примеры кода</h3>
80
<p>Простейшие операции над массивом можно представить в псевдокоде.</p>
80
<p>Простейшие операции над массивом можно представить в псевдокоде.</p>
81
<p>Создание и заполнение:</p>
81
<p>Создание и заполнение:</p>
82
<p>Такие шаблоны используются во всех языках программирования с минимальными синтаксическими вариациями.</p>
82
<p>Такие шаблоны используются во всех языках программирования с минимальными синтаксическими вариациями.</p>
83
<h2>Производительность и ограничения</h2>
83
<h2>Производительность и ограничения</h2>
84
<p>Массив обладает предсказуемыми характеристиками по скорости и потреблению памяти, но накладывает ограничения на способы работы с данными.</p>
84
<p>Массив обладает предсказуемыми характеристиками по скорости и потреблению памяти, но накладывает ограничения на способы работы с данными.</p>
85
<h3>Затраты памяти и скорость доступа</h3>
85
<h3>Затраты памяти и скорость доступа</h3>
86
<p>Благодаря непрерывному размещению элементов массив:</p>
86
<p>Благодаря непрерывному размещению элементов массив:</p>
87
<ul><li><p>минимизирует накладные расходы на служебную информацию;</p>
87
<ul><li><p>минимизирует накладные расходы на служебную информацию;</p>
88
</li>
88
</li>
89
<li><p>обеспечивает плотное использование кэша процессора;</p>
89
<li><p>обеспечивает плотное использование кэша процессора;</p>
90
</li>
90
</li>
91
<li><p>дает постоянное время доступа к элементу.</p>
91
<li><p>дает постоянное время доступа к элементу.</p>
92
</li>
92
</li>
93
</ul><p>Для больших массивов значимой становится стратегия выделения памяти. Необходимо учитывать ограничения по размеру непрерывного блока и поведение сборщика мусора в управляемых средах.</p>
93
</ul><p>Для больших массивов значимой становится стратегия выделения памяти. Необходимо учитывать ограничения по размеру непрерывного блока и поведение сборщика мусора в управляемых средах.</p>
94
<h3>Типичные проблемы</h3>
94
<h3>Типичные проблемы</h3>
95
<p>При работе с массивами часто возникают ошибки:</p>
95
<p>При работе с массивами часто возникают ошибки:</p>
96
<ul><li><p>выход за пределы допустимого диапазона индексов;</p>
96
<ul><li><p>выход за пределы допустимого диапазона индексов;</p>
97
</li>
97
</li>
98
<li><p>использование неинициализированных элементов;</p>
98
<li><p>использование неинициализированных элементов;</p>
99
</li>
99
</li>
100
<li><p>неэффективные вставки и удаления в середине последовательности.</p>
100
<li><p>неэффективные вставки и удаления в середине последовательности.</p>
101
</li>
101
</li>
102
</ul><p>Контроль границ и статическая типизация снижают риск подобных ошибок, но не устраняют их полностью.</p>
102
</ul><p>Контроль границ и статическая типизация снижают риск подобных ошибок, но не устраняют их полностью.</p>
103
<h2>Массивы в популярных языках программирования</h2>
103
<h2>Массивы в популярных языках программирования</h2>
104
<p>Разные языки предлагают собственные реализации массивов и массивоподобных структур, отличающиеся по семантике, набору операций и уровню безопасности.</p>
104
<p>Разные языки предлагают собственные реализации массивов и массивоподобных структур, отличающиеся по семантике, набору операций и уровню безопасности.</p>
105
<h3>Python</h3>
105
<h3>Python</h3>
106
<p>В Python базовым последовательным контейнером выступает список list, реализованный как динамический массив ссылок на объекты. Он поддерживает:</p>
106
<p>В Python базовым последовательным контейнером выступает список list, реализованный как динамический массив ссылок на объекты. Он поддерживает:</p>
107
<ul><li><p>произвольный доступ по индексу;</p>
107
<ul><li><p>произвольный доступ по индексу;</p>
108
</li>
108
</li>
109
<li><p>изменение размера;</p>
109
<li><p>изменение размера;</p>
110
</li>
110
</li>
111
<li><p>вставку и удаление элементов.</p>
111
<li><p>вставку и удаление элементов.</p>
112
</li>
112
</li>
113
</ul><p>Для компактного хранения однотипных числовых данных используются специализированные массивы из модулей array и numpy. Они размещают значения в памяти более плотно и обеспечивают векторные операции.</p>
113
</ul><p>Для компактного хранения однотипных числовых данных используются специализированные массивы из модулей array и numpy. Они размещают значения в памяти более плотно и обеспечивают векторные операции.</p>
114
<h3>Java</h3>
114
<h3>Java</h3>
115
<p>В Java массив - встроенный тип, объявляемый через T[]. Он хранит элементы фиксированного типа и размера, доступ к которым осуществляется по индексу. Проверка выхода за границы выполняется во время выполнения, при нарушении выбрасывается исключение.</p>
115
<p>В Java массив - встроенный тип, объявляемый через T[]. Он хранит элементы фиксированного типа и размера, доступ к которым осуществляется по индексу. Проверка выхода за границы выполняется во время выполнения, при нарушении выбрасывается исключение.</p>
116
<p>Для динамических последовательностей применяется класс ArrayList, реализованный на базе динамического массива. Он абстрагирует детали изменения емкости и предоставляет интерфейс коллекции.</p>
116
<p>Для динамических последовательностей применяется класс ArrayList, реализованный на базе динамического массива. Он абстрагирует детали изменения емкости и предоставляет интерфейс коллекции.</p>
117
<h3>C++</h3>
117
<h3>C++</h3>
118
<p>В C++ существует несколько способов представления массивов:</p>
118
<p>В C++ существует несколько способов представления массивов:</p>
119
<ul><li><p>сырые массивы T a[N], размер которых известен на этапе компиляции;</p>
119
<ul><li><p>сырые массивы T a[N], размер которых известен на этапе компиляции;</p>
120
</li>
120
</li>
121
<li><p>контейнер std::array для статических массивов фиксированной длины;</p>
121
<li><p>контейнер std::array для статических массивов фиксированной длины;</p>
122
</li>
122
</li>
123
<li><p>контейнер std::vector как стандартный динамический массив.</p>
123
<li><p>контейнер std::vector как стандартный динамический массив.</p>
124
</li>
124
</li>
125
</ul><p>Язык позволяет управлять памятью, но требует аккуратного контроля границ и времени жизни элементов.</p>
125
</ul><p>Язык позволяет управлять памятью, но требует аккуратного контроля границ и времени жизни элементов.</p>
126
<h2>Ресурсы для практического освоения</h2>
126
<h2>Ресурсы для практического освоения</h2>
127
<p>Изучение массивов включает понимание теории и систематическую практику. Для закрепления навыков полезно реализовать базовые операции и классические алгоритмы поверх этой структуры.</p>
127
<p>Изучение массивов включает понимание теории и систематическую практику. Для закрепления навыков полезно реализовать базовые операции и классические алгоритмы поверх этой структуры.</p>
128
<p>Рекомендуется:</p>
128
<p>Рекомендуется:</p>
129
<ul><li><p>решать задачи на перебор, поиск и сортировку данных в массивах;</p>
129
<ul><li><p>решать задачи на перебор, поиск и сортировку данных в массивах;</p>
130
</li>
130
</li>
131
<li><p>сравнивать время работы алгоритмов при различных объемах входных данных;</p>
131
<li><p>сравнивать время работы алгоритмов при различных объемах входных данных;</p>
132
</li>
132
</li>
133
<li><p>изучать реализации динамических массивов в стандартных библиотеках выбранного языка.</p>
133
<li><p>изучать реализации динамических массивов в стандартных библиотеках выбранного языка.</p>
134
</li>
134
</li>
135
</ul><p>Практическая работа с массивами формирует понимание поведения программ по памяти и времени выполнения.</p>
135
</ul><p>Практическая работа с массивами формирует понимание поведения программ по памяти и времени выполнения.</p>