Рубрики
Без рубрики

10 Общие структуры данных, объясненные видео + Упражнения

«Плохие программисты беспокоятся о коде. Хорошие программисты беспокоятся о структурах данных и их отношениях». – Linus Torvalds, создатель Linux ** Обновление ** Мой видео курс по алгоритмам сейчас живут! Проверьте алгоритмы в движении от изданий Мэннинга. Получите 39% скидку на мой курс, используя код «39Carnes»! Или вы можете получить

Автор оригинала: FreeCodeCamp Community Member.

Структуры данных являются важнейшей частью разработки программного обеспечения, а также одной из наиболее распространенных тем для вопросов собеседования разработчиков.

Хорошая новость заключается в том, что они в основном просто специализированные форматы для организации и хранения данных.

Я собираюсь научить вас 10 из наиболее распространенных структур данных – прямо здесь, в этой короткой статье.

Я встраиваемые видео, которые я создал для каждой из этих структур данных. Я также связал с примерами кода для каждого из них, которые показывают, как реализовать их в JavaScript.

И дать вам некоторую практику, я связался с проблемами из учебной программы FreeCodeCamp.

Обратите внимание, что некоторые из этих структур данных включают временную сложность в больших обозначении. Это не входит для всех из них, так как сложность времени иногда основана на том, как она реализована. Если вы хотите узнать больше о большом обозначении, проверьте мой Статья об этом или Это видео По Briana Marie Отказ

Также обратите внимание, что, хотя я показываю, как реализовать эти структуры данных в JavaScript, для большинства из них вам никогда не понадобится реализовать их самостоятельно, если вы не использовали язык низкого уровня, такими как C.

JavaScript (например, большинство языков высокого уровня) имеет встроенные реализации многих из этих структур данных.

Тем не менее, зная, как реализовать эти структуры данных даст вам огромный край в поисках работы вашего разработчика, и может пригодиться, когда вы пытаетесь написать высокопроизводительный код.

Связанные списки

Связанный список – одна из самых основных структур данных. Часто сравнивается с массивом, так как многие другие структуры данных могут быть реализованы либо с массивом, либо связанным списком. У каждого из них есть преимущества и недостатки.

Связанный список состоит из группы узлов, которые вместе представляют последовательность. Каждый узел содержит две вещи: фактические данные хранятся (которые могут быть в основном любой тип данных) и указателем (или ссылку) к следующему узлу в последовательности. Существуют также вдвойне связанные списки, где каждый узел имеет указатель на следующий элемент, так и предыдущий элемент в списке.

Наиболее основные операции в связанном списке добавляют элемент в список, удаляя элемент из списка и поиск списка для элемента.

Смотрите код для связанного списка в JavaScript здесь.

Соединенный список Сложность времени

0 (n) Космос 0 (n)
0 (n) Поиск 0 (n)
0(1) Вставлять 0(1)
0(1) Удалить 0(1)

Проблемы FreeCodecamp

Стеки

Стек – это основная структура данных, где вы можете вставлять только или удалять элементы в верхней части стека. Это вроде похоже на стопку книг. Если вы хотите посмотреть на книгу в середине стека, вы должны сначала взять все книги над ней.

Стек считается lifo (последний в первом месте) – означает последний элемент, который вы помещаете в стек, является первым элементом, который выходит из стека

Существует три основных операции, которые могут быть выполнены в стеках: вставка элемента в стек (называемый «push»), удаляя элемент из стека (называемый «POP») и отображение содержимого стека (иногда называемого «PIP» ‘).

Смотрите код для стека в JavaScript здесь.

Сложность времени стека

0 (n) Космос 0 (n)
0 (n) Поиск 0 (n)
0(1) Вставлять 0(1)
0(1) Удалить 0(1)

Проблемы FreeCodecamp

Очередь

Вы можете подумать о очереди как линию людей в продуктовом магазине. Первый в строке – первый, который будет подан. Так же, как очередь.

Очередь считается FIFO (первым в первую очередь), чтобы продемонстрировать способ доступа к данным. Это означает, что после добавления нового элемента все элементы, которые были добавлены перед удалением до того, как новый элемент можно удалить.

Очередь имеет только две основные операции: enqueue и dequeue. Enqueue означает вставку элемента в заднюю часть очереди и декабря означает, что удаляет передний элемент.

Смотрите код для очереди в JavaScript здесь.

Сложность времени в очередь

0 (n) Космос 0 (n)
0 (n) Поиск 0 (n)
0(1) Вставлять 0(1)
0(1) Удалить 0(1)

Проблемы FreeCodecamp

Набор

Установленная структура данных хранит значения без какого-либо конкретного порядка и без повторных значений. Помимо возможности добавлять и удалять элементы на множество, существует несколько других важных функций набора, которые работают с двумя множествами одновременно.

  • Союз – это объединяет все элементы из двух разных наборов и возвращает это в качестве нового набора (без дубликатов).
  • Пересечение – Учитывая два набора, эта функция возвращает другой набор, который имеет все элементы, которые являются частью обоих наборов.
  • Разница – это возвращает список предметов, которые находятся в одном наборе, но не в другом наборе.
  • Подмножество – это возвращает логическое значение, которое показывает, если все элементы в одном наборе включены в другой набор.

Просмотрите код для реализации набора в JavaScript здесь.

Проблемы FreeCodecamp

Карта

Карта – это структура данных, которая хранит данные в парах ключа/значения, где каждый ключ уникален. Карта иногда называют ассоциативным массивом или словарем. Это часто используется для быстрых дисплеев данных. Карты позволяют следующие вещи:

  • добавление пары к коллекции
  • удаление пары из коллекции
  • модификация существующей пары
  • поиск значения, связанного с определенным ключом

Просмотрите код для реализации карты в JavaScript здесь.

Проблемы FreeCodecamp

Хэш таблицы

Хэш-таблица – это структура данных карты, которая содержит пары ключа/значения. Он использует функцию хеша для вычисления индекса в массив ведерных слотов или слотов, из которых можно найти желаемое значение.

Функция хешей обычно принимает строку в качестве ввода, и она выводит числовое значение. Функция HASH должна всегда дать то же номер выхода для того же ввода. Когда два входа хешится к тому же численному выходу, это называется столкновением. Цель состоит в том, чтобы иметь несколько столкновений.

Таким образом, когда вы вводите пару клавишу/значения в хеш-таблицу, ключ проходит через функцию хеша и превратился в число. Это числовое значение затем используется в качестве фактического ключа, что значение сохраняется. Когда вы попытаетесь получить доступ к тому же ключу, функция HASHING будет обработать ключ и вернуть тот же числовой результат. Затем число будет использоваться для поиска соответствующего значения. Это обеспечивает очень эффективное время O (1) в среднем.

Просмотр кода для хеш-таблица здесь.

Сложность хеш таблицы

0 (n) Космос 0 (n)
0(1) Поиск 0 (n)
0(1) Вставлять 0 (n)
0(1) Удалить 0 (n)

Проблемы FreeCodecamp

Двоичное дерево поиска

Дерево – это структура данных, состоящая из узлов, она имеет следующие характеристики:

  1. Каждое дерево имеет корневой узел (вверху).
  2. Узел корневого узла имеет ноль или более детских узлов.
  3. Каждый узел ребенка имеет ноль или более детских узлов, и так далее.

А бинарный Поиск Дерево добавляет эти две характеристики:

  1. Каждый узел имеет к двум детям.
  2. Для каждого узла его левые потомки меньше текущего узла, который меньше, чем правильные потомки.

Двоичные поиски деревьев позволяют быстрым поиску, добавлением и удалением предметов. Способ того, что они настраиваются, означает, что в среднем каждое сравнение позволяет операциям пропустить около половины дерева, чтобы каждый поиск, вставка или делецию занимают время пропорционально логарифму количества предметов, хранящихся в дереве.

Просмотр кода для двоичного дерева поиска в JavaScript здесь Отказ

Сложность двоичного поиска

0 (n) Космос 0 (n)
0 (log n) Поиск 0 (n)
0 (log n) Вставлять 0 (n)
0 (log n) Удалить 0 (n)

Проблемы FreeCodecamp

Три

TRIE (произносится «попробовать») или префиксное дерево, является своего рода дерево поиска. TRIE хранит данные в шагах, где каждый шаг является узлом в TRIE. Пытаются, часто используются для хранения слов для быстрого поиска, например, слов автоматически полной функции.

Каждый узел на языке TRIE содержит одну букву слова. Вы следуете за ветками Три, чтобы записать слово, одно письмо за раз. Шаги начинают откладывать, когда порядок букв расходится от других слов в Три, или когда слово заканчивается. Каждый узел содержит букву (данные) и логическое значение, которое указывает, является ли узел последним узлом в слове.

Посмотрите на изображение, и вы можете сформировать слова. Всегда начинайте на корневом узле сверху и работать вниз. Три показаны здесь, содержит слово мяч, летучая мышь, кукла, делают, придурок, общежитие, отправить, смысл.

Просмотр кода для TRIE в JavaScript здесь.

Проблемы FreeCodecamp

Двоичная куча

Двоичная куча – это другой тип структуры данных деревьев. Каждый узел имеет у большинства двух детей. Кроме того, это полное дерево. Это означает, что все уровни полностью заполнены до последнего уровня, а последний уровень не заполнены слева направо.

Двоичная куча может быть либо минимальной кучей, либо максимальная куча. В максимальной куче ключи родительских узлов всегда больше или равны у детей. В минимальном куче ключи родительских узлов меньше или равны тем, что у детей.

Заказ между уровнями важен, но порядок узлов на одном уровне не важен. На изображении вы можете видеть, что третий уровень кучи Min имеет значения 10, 6 и 12. Эти цифры не в порядке.

Просмотр кода для кучи в JavaScript здесь.

Сложность двоичной кучи

0 (n) Космос 0 (n)
0(1) Поиск 0 (log n)
0 (log n) Вставлять 0 (log n)
0(1) Удалить 0(1)

Проблемы FreeCodecamp

График

Графики – это коллекции узлов (также называемых вершинами) и соединениями (называемыми краями) между ними. Графики также известны как сети.

Одним из примеров графиков является социальная сеть. Узлы – это люди, а края – это дружба.

Существует два основных типа графиков: направлены и неправоны. Неопряженные графики – это графики без какого-либо направления по краям между узлами. Направленные графики, напротив, являются графиками с направлением в его краях.

Два распространенных способа представить график представляют собой список смежных соседних и матрица смежности.

Список соседних может быть представлен в виде списка, где левая сторона – это узел, а правая сторона перечислены все другие узлы, к которым он подключен.

Матрица смежности – это сетка чисел, где каждая строка или колонка представляет собой другой узел в графике. На пересечении ряда и столбца – это число, указывающее на отношения. Нули значимы, нет края или отношений. Они означают, что есть отношения. Числа выше, чем можно использовать для поставления различных весов.

Обходные алгоритмы являются алгоритмы для прохождения или посещения узлов в графе. Основными видами алгоритмов обхода являются шириной – первый поиск и первый поиск. Одним из видов использования является определение того, насколько близко узлы являются корневым узлом. Смотрите, как реализовать побуждение – первый поиск в JavaScript на видео ниже.

См. Код для шириной – сначала поиска на графике матрицы смежности в JavaScript.

Сложность двоичного поиска

O (| V | + | E |) Место хранения
O (1) Добавить вершину
O (1) Добавить край
O (| V | + | E |) Удалить вершину
O (| E |) Удалить край
O (| V |) Запрос

Проблемы FreeCodecamp

Более

Книга Гроккинг алгоритмы Лучшая книга по теме, если вы новичок в структурах/алгоритмах данных и не имеют информационного фона. Он использует простые, чтобы понять объяснения и веселье, нарисованные вручную иллюстрацию (автором, который является ведущим разработчиком в ETSY), чтобы объяснить некоторые из структур данных, представленных в этой статье.

Алгоритмы Grokking: иллюстрированный гид для программистов и других любопытных людей Сводка Grokking Algorithms – это полностью проиллюстрированное, дружеское руководство, которое учит вас применить общие алгоритмы для … www.amazon.com.

Или вы можете проверить мой видео курс на основе этой книги: Алгоритмы в движении от гуннинговых публикаций Отказ Получите 39% скидка на мой курс с помощью кода ‘ 39Carnes ‘!