Структуры данных и массивы
Во-первых, что такое структура данных?
Это набор значений, которые могут иметь отношения между собой и функции, применяемые к ним. Каждая структура данных хороша и специализирована для решения своей конкретной задачи, а также для быстрого хранения и поиска определенных данных.
Огромный список структур данных можно найти здесь: Все структуры данных.
Однако есть только несколько основных, которые вам действительно нужно знать и которые используются в 90% случаев. Они есть:
- Массивы
- Стеки
- Очереди
- Связанные списки
- Деревья
- Пытается
- Графики
- Хэш-таблицы
Учтите, что у каждого языка свои структуры данных, пример таблицы можно найти здесь. Но если язык, который вы используете, не содержит определенной структуры данных, не беспокойтесь, вы можете ее построить. Например, если в Javascript нет стеков — вы можете их создать.
Массивы
Массивы организуют данные последовательно. Таким образом, они сохраняются в памяти друг за другом. Массивы являются одной из наиболее часто используемых структур данных и имеют наименьший размер среди всех структур данных.
Придя из программирования Bootcamp, я знал, что такое массивы и как их использовать, но изучив основы нотации Big O, которые можно найти в моем предыдущем блоге здесь, я понял, что простые встроенные методы на самом деле имеют множество различных нотаций Big O.
Возьмите этот простой массив ниже и два встроенных метода pop() и unshift():
Каким, по-вашему, должно быть их Большое О? Раньше я никогда бы не подумал об этом, думая… ну, .pop() берет последний элемент массива, а unshift просто вставляет элемент в начало. Простой…
Однако теперь вам нужно посмотреть, КАК этот метод работает.
Почему? Что ж, pop() — это просто. Независимо от длины ввода, метод просто возвращает последний элемент. Поэтому оно постоянно.
Однако unshift добавляет элемент в массив. Но? Это просто каждый раз помещает элемент в начало, так что, конечно же, это тоже константа?
Отчасти это правильно, однако индекс массива нужно изменить. Следовательно:
Unshift должен пройтись по массиву и присвоить каждому элементу новый индекс. Как мы знаем из предыдущего блога, простая функция цикла — это O(n) или линейное время.
Это пример, который должен заставить вас задуматься о том, подходит ли другой тип структуры данных для добавления нового элемента.
Это должно дать вам базовое понимание того, почему поиск чего-то в массиве выполняется быстро O(1), а добавление чего-то в массив медленнее O(n).
Давайте воспользуемся массивом, чтобы решить простую задачу обращения строки.
Здесь мы используем метод .split(). Согласно MDN, «метод split()
делит строку на упорядоченный список подстрок, помещает эти подстроки в массив и возвращает массив».
Затем мы используем метод .join(). Который создает и возвращает новую строку путем объединения всех элементов в массиве (или «подобном массиву объекта), разделенных запятыми или указанной строкой-разделителем. Если в массиве только один элемент, то этот элемент будет возвращен без использования разделителя».
Это был всего лишь базовый пример использования структуры данных массива для достижения определенного результата. Мы поместили строку в массив, что позволило нам достичь желаемого результата.
Массивы отлично подходят для быстрого поиска, доступа к тому индексу, который вы хотите найти, или добавления в конец массива или удаления элемента из конца массива, он также упорядочен в памяти. Однако он медленный для вставки и удаления и, наконец, если вы используете статический массив, то он имеет фиксированный размер.