Массивы — одна из наиболее используемых структур данных в JavaScript и практически в любом другом языке. Сегодня я расскажу о том, что это такое, что они делают и когда их использовать.
Итак, давайте приступим!
Что такое массивы?
Для начала я расскажу о массивах. Это структура данных, знакомая большинству программистов, которая упорядочивает данные последовательно, как показано ниже.
let basket = ['🥧', // 0 index
'🍤', // 1st index
'🍇', // 2nd index
'🍒', // 3rd index
'🍏', // 4th index
'🍎'] // 5th index
Довольно просто, верно? Массивы действительно хороши, потому что они представляют собой небольшую и простую структуру данных, которая является смежной в памяти, то есть каждое значение хранится рядом друг с другом, поэтому вам не нужно выделять много места для хранения данных. Кроме того, в JavaScript массивы можно изменять по размеру и они динамичны по своей природе. В отличие от статических массивов в других языках, которые имеют заранее определенный размер, поэтому вы не можете добавить в них больше значений. Вместо этого для статических массивов необходимо переместить массив в другое место в памяти, чтобы увеличить его размер, по сути, создавая новый массив.
Методы для массивов
При использовании массивов вот некоторые общие методы, которые имеют различную временную сложность:
- Доступ к i-му элементу O(1) — постоянное время: поскольку мы, по сути, обращаемся к ключу, который является индексом, и значению, которое является данными, хранящимися в этом индексе.
- Поиск O(n) — линейное время: Поскольку мы должны использовать индекс для доступа к значению, мы не сможем просто мгновенно получить значение, вместо этого нам придется перебрать n элементов массива, чтобы получить определенное значение.
- Переопределение элемента по i-му индексу O(1) — постоянное время: Аналогично доступу к i-му элементу все, что требуется, это использовать ключ: индекс, чтобы изменить значение по определенному индексу.
- Перебор всех элементов O(n) — линейное время: Перебор каждого элемента аналогичен поиску, поэтому мы будем перебирать столько элементов, сколько n в массиве.
- Вставка O(n)* — линейное время: Порядок имеет значение в массиве, поэтому если вы вставляете элемент в любой индекс, не являющийся последним, вам придется сдвинуть последующие индексы и увеличить их номер индекса на 1. Акт сдвига индексов увеличивает временную сложность до O(n) элементов, которые необходимо сдвинуть.
- Удаление O(n)* — линейное время: аналогично вышеописанному, за исключением того, что вам придется сдвигать индексы после, уменьшая их количество на 1.
*Примечание — Вам не нужно сдвигать индексы, если вы вставляете в конец массива или удаляете последний индекс.
Как мы видим, существуют различные типы временных сложностей для различных типов методов для массивов. Но, как мы заметили, последние два метода, Insertion и Deletion, различаются для последнего индекса массива. В JavaScript это также видно из того, что они имеют два очень специальных названия для своих методов:
basket.push()
basket.pop()
Как следует из названия, pop() удаляет индекс из конца массива, уменьшая его размер. В то время как push() добавляет индекс в конец массива, увеличивая его размер. Обе эти операции выполняются постоянно.
Когда использовать массивы JavaScript?
Представьте, что у вас есть колода карт:
Хорошее время для использования массива может быть, если вы создаете карточную игру, в которой вы получаете карты только из конца колоды. Это позволит вам использовать временную сложность O(1) функций pop() и push() для получения карт из верхней части колоды. Также в колоде карт имеет значение порядок, в котором вы кладете карты, поэтому он также будет представлен индексами массива.
В заключение
Массивы JavaScript позволяют нам хранить память, которая является непрерывной, имеет различные типы данных и упорядочена. Хотя у них есть некоторые недостатки, когда речь идет о вставке и удалении из-за смещения индексов. Она обеспечивает быстрый поиск и изменение индекса. Он также может быть строительным блоком для более сложных структур данных, о которых мы поговорим в будущем.