Как располагается массив в памяти компьютера?
Обновлено: 21.11.2024
C предоставляет массивы для хранения последовательности элементов одного типа данных. Начнем с аналогии. Предположим, у вас дома есть шкаф. Вы хотели бы держать книги на каждой полке шкафа. Было бы хорошо, если бы книги по одному предмету хранились на одной полке, а книги по другой тематике — на другой полке. Стойка — это массив. Стеллаж используется для хранения книг одной тематики. Точно так же массив может хранить данные одного типа. Когда вы объявляете массив, вы должны указать тип данных, которые этот массив будет содержать. Каждый элемент массива должен относиться к этому типу данных.
Синтаксис объявления массива:
Это массив целых чисел размером 5, называемый x. Точно так же
это массив чисел с плавающей запятой размером 6, называемый y.
Для доступа к элементам массива необходимо использовать нотацию массива. Первый элемент массива находится в позиции 0, второй — в позиции 1 и т. д. Последний элемент массива — в позиции size - 1.
Как видите, выбрав элемент с помощью записи массива, вы можете манипулировать этим элементом так же, как и любой переменной. Вот более сложный пример:
Инициализация массива I [ редактировать | изменить источник ]
Когда массив объявляется, он изначально "пустой"; он не содержит никаких значений. Мы можем инициализировать массив следующим образом:
называется блоком инициализации массива. Когда мы используем блок инициализации массива, нам не нужно указывать размер массива. Следующее эквивалентно:
Когда создали массив из 5 элементов. Первый элемент — 5, второй — 7 и т. д.
Инициализация массива II [ редактировать | изменить источник ]
Давайте посмотрим на небольшой фрагмент кода, который выводит количество дней в месяце.
Если вы не верите в свою способность считать, мы можем позволить компьютеру определить размер массива с помощью sizeof . Просто замените
Присвоение значений массива [ редактировать | изменить источник ]
Мы можем присвоить значения членам массива, используя индекс массива.
Таким образом, массив x будет содержать элементы 1, 2, 3, 4 и 5.
Передача массивов в функцию [ edit | изменить источник ]
Массивы нельзя передавать в функции. Если имя массива используется в качестве аргумента при вызове функции, передается адрес первого элемента массива. Функция может получить доступ к массиву через этот адрес.
Предположим, мы хотим написать функцию, которая возвращает сумму элементов массива.
Обратите внимание, что имя массива marbles используется в качестве аргумента функции. Функция ожидает массив, потому что ее параметр определен как int arr[] . На самом деле передается адрес шариков[0] . Затем функция может получить доступ к массиву, используя запись массива.
Как массивы хранятся в памяти? [править | изменить источник ]
Когда мы объявляем массив, в памяти компьютера резервируется место для массива. Элементы массива хранятся в этих ячейках памяти. Важной особенностью массивов является то, что элементы массива всегда хранятся в последовательных ячейках памяти. Мы можем проверить этот факт, напечатав адреса памяти элементов. (Точно так же, как у каждого человека есть почтовый адрес, у каждого места в памяти есть адрес памяти, обычно номер, по которому его можно однозначно идентифицировать.)
Как видно из вывода, элементы хранятся по адресам ffe2, ffe4, ffe6 и т. д. Вам может быть интересно, почему числа идут не подряд. Причина очень проста. Размер типа данных int в C составляет не менее 2 байт (в зависимости от реализации). В этом примере он имеет ширину 2 байта, поэтому a[0] будет храниться в ffe2, ffe3, a[1] будет храниться в ffe4, ffe5, a[2] будет храниться в ffe6, ffe7 и так далее.< /p>
Если вместо этого мы объявим массив чисел с плавающей запятой (каждый из которых обычно занимает около 4 байтов), мы обнаружим, что a[0] будет храниться по адресу ffe2, ffe3, ffe4, ffe5, a[1] будет храниться по адресу ffe6. , ffe7, ffe8, ffe9 и так далее. Обратите внимание, что вы можете увидеть совершенно разные числа, обозначающие расположение адресов.
Как видите, элементы последовательны. На этом урок о массивах закончен.
Массивы часто представляются диаграммами, отражающими использование ими памяти. Указатели содержат адрес памяти других данных и представлены черным диском со стрелкой, указывающей на данные, на которые он ссылается. Фактическая переменная массива, a в этом примере, является указателем на память для всех его элементов.
Точно так же, как массив хранится в памяти?
Элементы массива хранятся в смежных ячейках памяти. Если вы создали массив локально, он будет в стеке. Где хранятся элементы, зависит от спецификации хранилища. Динамически созданный массив будет создан в куче.
Кроме того, сколько массивов типов может быть представлено в памяти? Таким образом, пять элементов будут храниться в пяти соседних местах памяти.вы можете наблюдать это, ссылаясь на адрес памяти каждого элемента. В отличие от других примитивных типов данных в C, идентификатор массива (здесь, arr) сам по себе представляет его указатель.
Кроме того, что такое Array, объясните представление массива в памяти?
Массив – это набор однородных (однотипных) элементов данных, хранящихся в смежных ячейках памяти. Например, если массив имеет тип «int», он может хранить только целочисленные элементы и не может допускать элементы других типов, таких как double, float, char и т. д.
Как двумерные массивы представляют память?
Представление двумерного массива в памяти осуществляется по строкам и по столбцам. Элементы двумерного массива располагаются в строках и столбцах, а новый оператор для двумерных массивов указывает как количество строк, так и количество столбцов.
Что будет элементами массива?
Доступ к элементам массива осуществляется путем указания индекса (смещения) нужного элемента в квадратных скобках [ ] после имени массива. Индексы массива должны быть целочисленного типа. ( int, long int, char и т. д.). Например, массив из пяти элементов будет иметь индексы от нуля до четырех.
Экономят ли массивы память?
Возвращаясь к вопросу, массив последовательно хранит объекты в памяти. Массив — это подтип того, что часто называют коллекцией. У каждого типа коллекции есть свои преимущества и недостатки. В случае массива доступ к каждому из последовательно сохраненных объектов осуществляется с использованием числового индекса.
Какова структура массива?
В информатике структура данных массива или просто массив – это структура данных, состоящая из набора элементов (значений или переменных), каждый из которых идентифицируется как минимум одним индексом или ключом массива.
Как вы храните данные в массиве?
Хранение данных в массивах. Присвоение значений элементу массива аналогично присвоению значений скалярным переменным. Просто укажите отдельный элемент массива, используя имя массива и индекс в круглых скобках, затем используйте оператор присваивания (=), за которым следует значение.
Что такое массив памяти?
Массивы памяти строятся как массивы битовых ячеек, каждая из которых хранит 1 бит данных. Для каждой комбинации битов адреса память устанавливает одну строку слов, которая активирует битовые ячейки в этой строке. Когда словная строка имеет ВЫСОКИЙ уровень, сохраненный бит передается в битовую строку или из нее.
Что такое стековая память?
Стек — это специальная область памяти компьютера, в которой хранятся временные переменные, созданные функцией. В стеке переменные объявляются, сохраняются и инициализируются во время выполнения. Это временное запоминающее устройство. Раздел стека в основном содержит методы, локальные переменные и ссылочные переменные.
Где хранятся элементы массива?
Когда мы объявляем массив, в памяти компьютера резервируется место для массива. Элементы массива хранятся в этих ячейках памяти. Важной особенностью массивов является то, что элементы массива всегда хранятся в последовательных ячейках памяти.
Как скопировать содержимое массива?
Существует несколько способов копирования элементов из одного массива в Java, например. вы можете вручную копировать элементы с помощью цикла, создать клон массива, использовать массивы. метод copyOf() или System. arrayCopy(), чтобы начать копирование элементов из одного массива в другой в Java.
Что такое диаграмма массива?
• ленточные схемы. • номерные облигации. Массив — это способ представления умножения и деления с использованием строк и столбцов. Строки представляют количество групп. Столбцы представляют число в каждой группе или размер каждой группы.
Что такое массив и его типы?
Массив — это набор из одного или нескольких значений одного типа. Каждое значение называется элементом массива. Элементы массива имеют одно и то же имя переменной, но каждый элемент имеет свой собственный уникальный номер индекса (также известный как индекс). Массив может быть любого типа, например: int, float, char и т.д.
Что такое представление массива?
Массив — это контейнер, который может содержать фиксированное количество элементов, и эти элементы должны быть одного типа. Большинство структур данных используют массивы для реализации своих алгоритмов. Индекс — каждое местоположение элемента в массиве имеет числовой индекс, который используется для идентификации элемента.
Каковы применения массива?
Применение массивов Массивы используются для реализации математических векторов и матриц, а также других видов прямоугольных таблиц. Массивы используются для реализации других структур данных, таких как списки, кучи, хэш-таблицы, очереди, очереди и стеки.
Что такое массив с примером?
Массив. Массив — это структура данных, содержащая группу элементов. Обычно все эти элементы имеют один и тот же тип данных, например целое число или строку. Например, поисковая система может использовать массив для хранения веб-страниц, найденных в результате поиска, выполненного пользователем.
Какие типы массивов существуют в структуре данных?
Типы массивов. Доступ к этому типу массива осуществляется по нижнему индексу индекса столбца или строки. Двумерный массив: доступ к двумерному массиву будет осуществляться с использованием нижнего индекса индекса строки и столбца. Для обхода двумерного массива будут учитываться значения строк и столбцов.
Если бы у нее были привязанности и теплая юношеская кровь, она была бы быстрой в движении, как мяч, мои слова связали бы ее с моей милой любовью, а его со мной?
массивы — как они работают?
В компьютерных науках существует понятие линейной структуры данных, означающее, что данные структурированы линейным образом, и порядок имеет значение. Есть массивы и связанные списки, но сегодня я буду говорить в основном о массивах и немного о связанных списках.
Большинство объектно-ориентированных языков поставляются с массивами, тогда как большинство fфункциональных языков поставляются со связанными списками (см. почему в другой моей статье, упомянутой в конце этой статьи).
Для такой дифференциации есть веская причина, о которой мы поговорим позже. А пока давайте просто взглянем на различия между двумя структурами данных. Для этого нам нужно совершить путешествие по закоулкам памяти.
Перемотать время
Объекты, функции и все, что мы знаем о компьютерах, в основном хранится в битах и байтах компьютера.
В таких языках, как Java и C, вы должны заранее явно объявить размер массива.
В Ruby мы используем Array для наших линейных структур данных. Мы можем добавлять, казалось бы, бесконечное количество элементов в массив Ruby, и для нас это не имеет значения.
Прекрасно, не так ли?! Это означает, что массивы бесконечно велики, верно? И что Ruby — превосходный язык? Нам повезло!
Но не так быстро. *лопает пузырь*
Не существует массивов бесконечного размера; то, что вы видите в Ruby, — это то, что мы называем динамическим массивом, и за это приходится платить.
Чтобы понять, что такое динамические массивы, давайте сначала посмотрим, как массивы представлены в памяти. Поскольку MRI Ruby (интерпретатор Ruby от Matz) компилируется в код C, мы рассмотрим, как массивы представлены в C.
C-ing верит
Мы немного углубимся в код C, чтобы сделать C немного лучше... :)
В языках более низкого уровня, таких как C, вам придется самостоятельно иметь дело с указателями и распределением памяти. Даже если вы раньше не имели дело с C (dотказ от ответственности — я тоже), у вас может быть C-een, один из самых (не)известных примеров ниже:
Давайте разберем этот фрагмент кода:
- malloc не имеет никакого волшебного смысла, он буквально означает выделение памяти
- malloc возвращает указатель
- malloc принимает в качестве аргумента размер памяти, которую программа должна выделить для вас.
- 100 * sizeof(int) сообщает программе, что мы хотим сохранить 100 целых чисел, поэтому выделите нам 100 * размер того, что будет занимать каждое целое число.
- ptr /pointer хранит ссылку на адрес памяти.
Тимми сдает багаж!
Если приведенный выше пример не имеет смысла, попробуйте эту аналогию. Думайте о распределении памяти как о консьерже багажа. Это работает следующим образом:
- Тимми идет к стойке и говорит консьержу, что у него есть 2 единицы багажа, примерно вот такого большого, и что он хотел бы оставить их в кладовой.
- Консьерж осматривает кладовую и говорит: "Да, у нас есть место в обозначенной зоне B4, и мы выделим это место для хранения вашего багажа".
- Они вручают Тимми карточку с обозначенной областью, в нашем случае B4.
- Тимми доволен, ходит куда угодно, а когда хочет забрать свой багаж, возвращается к стойке и показывает свою карточку. «Вы проверили мой багаж?»
В нашем примере багаж Тимми — это данные, а карточка получения — указатель (на нем указано, где хранится сумка Тимми). Место, где консьерж хранит багаж Тимми, — это блок памяти, а стойка — программа.
Показывая счетчику (программе) карту Тимми (указатель/адрес памяти), Тимми может получить свой багаж (данные). Бонус? Поскольку они точно знают, где хранится сумка Тимми — B4 , это означает, что они могут относительно быстро получить весь багаж Тимми!
Кроме того, вы когда-нибудь задумывались, почему вы обращаетесь к элементам в массиве с помощью индекса, вот так?
Это связано с тем, что массив содержит ссылки на блок памяти, а индекс сообщает ему смещение.
Аналогия: если я попрошу вас найти Тимми в очереди из 20 человек, по логике вещей вам придется спросить каждого из них, Тимми ли они. Но если я скажу вам, что Тимми — шестой (указатель) от первого лица (ваш первоначальный указатель), вы точно знаете, где искать.
Извлечение элементов в массивах происходит быстро именно из-за этого — программе не нужно просматривать все 100 элементов, чтобы найти то, что вы ищете. Если у вас есть индекс, ему просто нужно добавить смещение к исходному адресу памяти, и дроид, которого вы искали, будет тут же!
Что же такое динамические массивы?
Итак, я немного рассказал вам о том, как массивы представлены в памяти, но теперь пришло время поговорить о некоторых минусах.
Помните, как нужно явно указывать необходимый объем памяти? Это означает, что массив найдет место, которое будет точно соответствовать вашему размеру. Нет никакой гарантии, что он сможет вместить больше, чем у вас есть (поскольку блок памяти сразу за ним может быть занят).
Вернемся к нашей аналогии с багажом: представьте, что Тимми должен хранить 2 единицы багажа, а B4 может хранить ровно 2 единицы багажа, поэтому они выделяют это Тимми. Теперь по какой-то причине Тимми хочет оставить еще одно место багажа, но B4 не может хранить 3 места, только 2, так что они делают?
Они берут весь его багаж, перемещают его в новое место, где может поместиться более 3 предметов, а затем хранят все вместе.
Это дорогостоящая операция, но именно так работает и память!
В Ruby вам не нужно объявлять конкретный размер перед началом, потому что Ruby автоматически обрабатывает его за вас с помощью динамических массивов.
Действие динамического массива заключается в том, что если массив приближается к своей полной емкости, он автоматически объявляет новый массив большего размера и перемещает в него все существующие элементы, а старый массив затем удаляется сборщиком мусора. Насколько больше? Фактор роста обычно равен 2; удвоить размер текущего массива.
На самом деле, не верьте мне на слово.
В Ruby есть модуль ObjectSpace, который позволяет нам взаимодействовать с текущими объектами, находящимися в памяти. Мы можем использовать этот модуль, чтобы взглянуть на использование памяти нашим динамическим массивом — звучит именно так, как мы хотим!
Я написал небольшой скрипт на Ruby, который вычисляет коэффициент роста динамического массива. Не стесняйтесь взглянуть на это здесь, и если вы это сделаете, вы увидите, что массивы Ruby имеют 1,5-кратный коэффициент роста (то есть они делают массив на 50% больше при каждой копии).
Я знаю, что такое массивы, что такое связанные списки?
Имейте в виду, что хотя массивы и связанные списки считаются линейными структурами данных, между ними есть одно большое различие.
Элементы массива хранятся буквально рядом друг с другом в памяти (поэтому у нас может быть индекс для быстрого поиска). Но узлы в связанных списках не имеют такого ограничения (поэтому для связанных списков нет поиска по индексу) — каждый элемент может храниться в любом месте блока памяти.
Это похоже на то, как если бы Тимми пытался хранить 5 единиц багажа, а консьержу не хватило места, и он решил разложить их повсюду. Звучит неорганизованно?
Кроме того, если они хранятся в разных местах, как узнать, какие сумки принадлежат Тимми? Подсказка: просто следите за следующим узлом/сумкой! В нашем случае консьерж хранит их отдельно, но с меткой на каждой из них, указывающей на следующую сумку.
Узел в связанном списке состоит из двух частей — части данных и указателя на следующий узел. Вот как они могут поддерживать линейную часть — у них все еще есть концепция порядка, просто их не нужно хранить в буквальном порядке!
узел = [данные | указатель ]
Например, для следующего примера, хранящегося в памяти:
[С | Д] [А | Б] [Б | С] [Д | ноль]
Эти биты выглядят не по порядку, но если бы я сказал вам, что первым элементом является A , вы могли бы сказать мне точный порядок списка:
список = [A -> B -> C -> D -> ноль]
Есть много интересных вещей, которые вы можете сделать со связанными списками, которые я не буду здесь подробно описывать (также много о большом O, о чем я не говорил). Но уже есть масса хороших статей о структурах данных. Если вы попали сюда, я предлагаю вам прочитать запись в блоге Али здесь.
Вы также можете прочитать больше о List/Cons на Wiki здесь.
Заключительное примечание
Изначально я написал эту статью немного по другой теме — [ Эликсир | Почему связные списки?], но обнаружил, что объяснение того, как работают массивы, заняло слишком много времени, прежде чем я смог объяснить, почему Эликсир использует связанные списки. Поэтому я разделил их на две статьи.
В этой статье я рассказываю о том, почему функциональные языки используют связанные списки в качестве своей линейной структуры данных. Проверьте это!
👋 Добро пожаловать! Начнем с важного контекста. Позвольте спросить:
✅ Слушаете ли вы музыку на смартфоне?
✅ Ведете ли вы список контактов на телефоне?
✅ Видели ли вы когда-нибудь таблицу лидеров во время соревнований? ?
Если вы ответили «да» на любой из этих вопросов, то почти наверняка вы использовали массивы и даже не знали об этом! 😃 Массивы — это очень мощные структуры данных, в которых хранятся списки элементов. У них бесконечное количество применений. Они очень важны в мире информатики.
В этой статье вы узнаете о плюсах и минусах массивов, их структуре, операциях и вариантах использования.
Начнем! 👍
🔎 Глубокое погружение в базовую структуру массивов
Чтобы понять, как они работают, очень полезно представить память вашего компьютера в виде сетки, как показано ниже. Каждая часть информации хранится в одном из тех маленьких элементов (квадратов), которые составляют сетку.
Массивы используют преимущества этой «сетчатой» структуры для хранения списков связанной информации в соседних ячейках памяти, чтобы гарантировать максимальную эффективность поиска этих значений. 🔳🔳🔳🔳
Можно думать о массивах следующим образом:
Их элементы расположены в памяти рядом друг с другом. Если вам нужно получить доступ к нескольким из них, процесс максимально оптимизирован, поскольку ваш компьютер уже знает, где находится значение.
Отлично, правда? Давайте узнаем, как это работает за кулисами! 😃
📚 Классификация
Массивы классифицируются как однородные структуры данных, поскольку в них хранятся элементы одного типа.
Они могут хранить числа, строки, логические значения (true и false), символы, объекты и т. д. Но как только вы определите тип значений, которые будет хранить ваш массив, все его элементы должны быть одного и того же типа. Вы не можете «смешивать» разные типы данных.
👀 Чтение ценностей — волшебство начинается!
Удивительная сила массивов заключается в их эффективности доступа к значениям. Это достигается благодаря его сетчатой структуре. Давайте рассмотрим это подробнее.🔍
При создании массива вы:
– присваиваете его переменной. 👈
- Определите тип элементов, которые он будет хранить. 🎈
- Определите его размер (максимальное количество элементов). 📚
💡 Примечание. Имя, которое вы присваиваете этой переменной, очень важно, поскольку позже вы будете использовать его в своем коде для доступа к значениям и изменения массива.
Но как сообщить компьютеру, к какому конкретному значению вы хотите получить доступ? Именно здесь индексы играют жизненно важную роль!
1️⃣ Индексы
Вы используете так называемый "индекс" ("индексы" во множественном числе) для доступа к значению в массиве. Это число, обозначающее место, где хранится значение.
Как видно на диаграмме ниже, первый элемент массива имеет индекс 0. По мере продвижения вправо индекс увеличивается на единицу для каждого места в памяти.
💡 Примечание. Я знаю, что поначалу кажется странным начинать отсчет с 0 вместо 1, но это называется нумерацией с нуля. Это очень распространено в информатике.
Общий синтаксис для доступа к элементу: [ ]
Например:
Если ваш массив хранится в переменной myArray и вы хотите получить доступ к первому элементу (с индексом 0), вы должны использовать myArray[0]
2️⃣ Память
Теперь, когда вы знаете, как получить доступ к значениям, давайте посмотрим, как массивы хранятся в памяти вашего компьютера. Когда вы определяете размер массива, все это пространство в памяти с этого момента «зарезервировано» для будущих значений, которые вы, возможно, захотите вставить.
💡 Примечание. Если вы не заполните массив значениями, это пространство будет оставаться зарезервированным и пустым до тех пор, пока вы это не сделаете.
Например:
Допустим, вы определили массив размером 5, но вставили только одно значение. Все оставшееся пространство будет пустым и «зарезервировано» в памяти для будущих назначений.
Это важно, потому что массивы чрезвычайно эффективны при доступе к значениям, поскольку все элементы хранятся в смежных областях памяти. Таким образом, компьютер точно знает, где искать запрошенную вами информацию.
Но… у этого есть и обратная сторона 😞, потому что это неэффективно с точки зрения использования памяти. Вы резервируете память для будущих операций, которые могут не произойти. Вот почему массивы рекомендуются в ситуациях, когда вы заранее знаете, сколько элементов вы собираетесь хранить.
🔧 Операция — за кадром!
Теперь, когда вы знаете, что такое массивы, когда они используются и как в них хранятся элементы, мы углубимся в их операции, такие как вставка и удаление.
1️⃣ Вставка — Добро пожаловать!
Допустим, у нас есть массив размером 6 и в нем еще есть пустое место.Мы хотим вставить элемент «е» в начало массива (индекс 0), но это место уже занято элементом «а». Что нам делать?
Для вставки в массивы мы перемещаем все элементы, расположенные справа от места вставки, на один индекс вправо. Элемент «a» теперь будет иметь индекс 1, элемент «b» будет иметь индекс 2 и так далее…
💡 Примечание. Вам нужно будет создать переменную, чтобы отслеживать последний индекс, содержащий элементы. На приведенной выше диаграмме массив заполняется до индекса 4 перед вставкой. Таким образом, вы можете определить, заполнен ли массив и какой индекс следует использовать для вставки элемента в конец.
После этого наш элемент успешно вставлен. 👏
⚠️ Минуточку! Что произойдет, если массив заполнен?
Как вы думаете, что произойдет, если массив будет заполнен, а вы попытаетесь вставить элемент? 😱
В этом случае вам нужно создать новый массив большего размера и вручную скопировать все элементы в этот новый массив. Эта операция очень дорогая по времени. Представьте, что было бы, если бы у вас был массив с миллионами элементов! Это может занять очень много времени. ⏳
💡 Примечание. Единственным исключением из этого правила, когда вставка выполняется очень быстро, является ситуация, когда вы вставляете элемент в конец массива (по индексу, расположенному справа от последнего элемента), а место еще есть. . Это делается за постоянное время O(1).
2️⃣ Удаление — Пока, пока!
Теперь допустим, что вы хотите удалить элемент из массива.
Для поддержания эффективности произвольного доступа (возможности чрезвычайно быстрого доступа к массиву через индекс) элементы должны храниться в смежных областях памяти. Вы не можете просто удалить элемент и оставить это место пустым.
Вы должны переместить элементы, которые идут после элемента, который вы хотите удалить, на один индекс влево.
И, наконец, у вас есть результирующий массив 👇. Как видите, буква «b» успешно удалена.
💡 Примечание. Удаление очень эффективно, когда вы удаляете последний элемент. Поскольку вам нужно создать переменную для отслеживания последнего индекса, содержащего элементы (на диаграмме выше индекс 3), вы можете напрямую удалить этот элемент с помощью индекса.
3️⃣ Поиск элемента
У вас есть три варианта поиска элемента в массиве:
- Если вы знаете, где он находится, используйте указатель.
- Если вы не знаете, где он находится, и ваши данные отсортированы, вы можете использовать алгоритмы для оптимизации поиска, например двоичный поиск.
- Если вы не знаете, где он находится, и ваши данные не отсортированы, вам нужно будет просмотреть каждый элемент в массиве и проверить, является ли текущий элемент тем элементом, который вы ищете (см. последовательность диаграмм ниже).
👋 В заключение…
- Массивы — это очень мощные структуры данных, в которых хранятся элементы одного типа. Тип элементов и размер массива фиксируются и определяются при его создании.
- Память выделяется сразу после создания массива и остается пустой, пока вы не присвоите значения.
- Их элементы расположены в смежных местах в памяти, поэтому к ним можно получить очень эффективный доступ (произвольный доступ, O(1) = постоянное время) с использованием индексов.
- Индексы начинаются с 0, а не с 1, как мы привыкли.
- Вставка элементов в начало или в середину массива предполагает перемещение элементов вправо. Если массив заполнен, создается новый массив большего размера (что не очень эффективно). Вставка в конец массива очень эффективна, постоянное время O(1).
- Удаление элементов из начала или из середины массива предполагает перемещение всех элементов влево, чтобы не оставить пустого места в памяти. Это гарантирует, что элементы хранятся в смежных областях памяти. Удаление в конце массива очень эффективно, поскольку удаляется только последний элемент.
- Чтобы найти элемент, вам нужно проверить весь массив, пока вы его не найдете. Если данные отсортированы, для оптимизации процесса можно использовать такие алгоритмы, как двоичный поиск.
«Учитесь у вчерашнего дня, живите сегодняшним днем, надейтесь на завтрашний день. Важно не переставать задавать вопросы».
👋 Спасибо!
Я очень надеюсь, что вам понравилась моя статья. ❤️
Подпишитесь на меня в Твиттере, чтобы найти больше статей, подобных этой. 😃
Читайте также: