HTML Diff
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>