Что такое структурирование данных

10 типов структур данных, которые нужно знать + видео и упражнения

Екатерина Малахова, редактор-фрилансер, специально для блога Нетологии адаптировала статью Beau Carnes об основных типах структур данных.

«Плохие программисты думают о коде. Хорошие программисты думают о структурах данных и их взаимосвязях», — Линус Торвальдс, создатель Linux.

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

В этой статье я покажу вам 10 самых распространенных структур данных. Для каждой из них приведены видео и примеры их реализации на JavaScript. Чтобы вы смогли попрактиковаться, я также добавил несколько упражнений из бета-версии новой учебной программы freeCodeCamp.

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

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

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

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных
Так устроен связный список

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

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

Упражнения от freeCodeCamp

Стеки

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных
Так устроен стек

В стеках можно выполнять три операции: добавление элемента (push), удаление элемента (pop) и отображение содержимого стека (pip).

Упражнения от freeCodeCamp

Очереди

Эту структуру можно представить как очередь в продуктовом магазине. Первым обслуживают того, кто пришёл в самом начале — всё как в жизни.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных
Так устроена очередь

Очередь устроена по принципу FIFO (First In First Out, «первый пришёл — первый вышел»). Это значит, что удалить элемент можно только после того, как были убраны все ранее добавленные элементы.

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

Упражнения от freeCodeCamp

Множества

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных
Так выглядит множество

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

Упражнения от freeCodeCamp

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

Источник

10 типов структур данных, которые нужно знать

Екатерина Малахова, редактор-фрилансер, специально для блога Нетологии адаптировала статью Beau Carnes об основных типах структур данных.

«Плохие программисты думают о коде. Хорошие программисты думают о структурах данных и их взаимосвязях», — Линус Торвальдс, создатель Linux.

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

В этой статье я покажу вам 10 самых распространенных структур данных. Для каждой из них приведены видео и примеры их реализации на JavaScript. Чтобы вы смогли попрактиковаться, я также добавил несколько упражнений из бета-версии новой учебной программы freeCodeCamp.

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

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

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

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Так устроен связный список

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

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

Временная сложность связного списка

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Упражнения от freeCodeCamp

Стеки

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

В стеках можно выполнять три операции: добавление элемента (push), удаление элемента (pop) и отображение содержимого стека (pip).

Временная сложность стека

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Упражнения от freeCodeCamp

Очереди

Эту структуру можно представить как очередь в продуктовом магазине. Первым обслуживают того, кто пришёл в самом начале — всё как в жизни.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Так устроена очередь

Очередь устроена по принципу FIFO (First In First Out, «первый пришёл — первый вышел»). Это значит, что удалить элемент можно только после того, как были убраны все ранее добавленные элементы.

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

Временная сложность очереди

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Упражнения от freeCodeCamp

Множества

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Так выглядит множество

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

Упражнения от freeCodeCamp

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Так устроена структура map

Упражнения от freeCodeCamp

Хэш-таблицы

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Так работают хэш-таблица и хэш-функция

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

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

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

Временная сложность хэш-таблицы

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Упражнения от freeCodeCamp

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

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

Дерево — это структура данных, состоящая из узлов. Ей присущи следующие свойства:

У двоичного дерева поиска есть два дополнительных свойства:

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

Временная сложность двоичного дерева поиска

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Упражнения от freeCodeCamp

Префиксное дерево

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Так устроено префиксное дерево

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

Посмотрите на иллюстрацию и попробуйте составить слова. Всегда начинайте с корневого узла вверху и спускайтесь вниз. Это дерево содержит следующие слова: ball, bat, doll, do, dork, dorm, send, sense.

Упражнения от freeCodeCamp

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

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Так устроены минимальная и максимальная кучи

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

Порядок уровней в двоичной куче важен, в отличие от порядка узлов на одном и том же уровне. На иллюстрации видно, что в минимальной куче на третьем уровне значения идут не по порядку: 10, 6 и 12.

Временная сложность двоичной кучи

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Упражнения от freeCodeCamp

Графы — это совокупности узлов (вершин) и связей между ними (рёбер). Также их называют сетями.

По такому принципу устроены социальные сети: узлы — это люди, а рёбра — их отношения.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Графы делятся на два основных типа: ориентированные и неориентированные. У неориентированных графов рёбра между узлами не имеют какого-либо направления, тогда как у рёбер в ориентированных графах оно есть.

Чаще всего граф изображают в каком-либо из двух видов: это может быть список смежности или матрица смежности.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Граф в виде матрицы смежности

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

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

Существуют специальные алгоритмы для просмотра рёбер и вершин в графах — так называемые алгоритмы обхода. К их основным типам относят поиск в ширину (breadth-first search) и в глубину (depth-first search). Как вариант, с их помощью можно определить, насколько близко к корневому узлу находятся те или иные вершины графа. В видео ниже показано, как на JavaScript выполнить поиск в ширину.

Временная сложность списка смежности (графа)

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Упражнения от freeCodeCamp

Узнать больше

Если до этого вы никогда не сталкивались с алгоритмами или структурами данных, и у вас нет какой-либо подготовки в области ИТ, лучше всего подойдет книга Grokking Algorithms. В ней материал подан доступно и с забавными иллюстрациями (их автор — ведущий разработчик в Etsy), в том числе и по некоторым структурам данных, которые мы рассмотрели в этой статье.

Мнение автора и редакции может не совпадать. Хотите написать колонку для «Нетологии»? Читайте наши условия публикации.

Источник

10 структур данных, которые вы должны знать (+видео и задания)

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

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

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

Задания с freeCodeCamp:

Стеки

Задания с freeCodeCamp:

Очереди

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Если рассматривать очередь с точки доступа к данным, то она является FIFO (First In First Out). Это означает, что после добавления нового элемента все элементы, которые были добавлены до этого, должны быть удалены до того, как новый элемент будет удален.
В очереди есть только две основные операции: enqueue и dequeue. Enqueue означает вставить элемент в конец очереди, а dequeue означает удаление переднего элемента.

Задания с freeCodeCamp:

Множества

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

Задания с freeCodeCamp:

Задания с freeCodeCamp:

Хэш-таблицы

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Задания с freeCodeCamp:

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Двоичное дерево поиска имеет + две характеристики:

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


Задания с freeCodeCamp:

Префиксное дерево

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Каждый узел в префиксном дереве содержит одну букву слова. Вы следуете ветвям дерева, чтобы записать слово, по одной букве за раз. Шаги начинают расходиться, когда порядок букв отличается от других слов в дереве или, когда заканчивается слово. Каждый узел содержит букву (данные) и логическое значение, указывающее, является ли узел последним узлом в слове.
Посмотрите на изображение, и вы можете создавать слова. Всегда начинайте с корневого узла вверху и двигайтесь вниз. Показанное здесь дерево содержит слово ball, bat, doll, do, dork, dorm, send, sense.

Задания с freeCodeCamp:

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

Задания с freeCodeCamp:

Графы

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных


Задания с freeCodeCamp:

Если хотите узнать больше:

Источник

Структуры данных. Неформальный гайд

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

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

Очередь

Итак, поздоровайтесь с Лупи!

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Лупи обожает играть в хоккей со своей семьей. И под “игрой”, я подразумеваю:

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Когда черепашки залетают в ворота, их выбрасывает на верх стопки. Заметьте, первая черепашка, добавленная в стопку — первой ее покидает. Это называется Очередь. Так же, как и в тех очередях, что мы видим в повседневной жизни, первый добавленный в список элемент — первым его покидает. Еще эту структуру называют FIFO (First In First Out).

Как насчет операций вставки и удаления?

После такой веселой игры в хоккей, Лупи делает для всех блинчики. Она кладет их в одну стопку.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Когда все блинчики готовы, Лупи подает их всей семье, один за одним.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Заметьте, что первый сделанный ею блинчик — будет подан последним. Это называется Стек. Последний элемент, добавленный в список — покинет его первым. Также эту структуру данных называют LIFO (Last In First Out).

Добавление и удаление элементов?

Вы когда-нибудь видели башню плотности?

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Он займет место, в зависимости от своей плотности.

Примерно так работает Куча.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Куча — двоичное дерево. А это значит, что каждый родительский элемент имеет два дочерних. И хотя мы называем эту структуру данных кучей, но выражается она через обычный массив.
Также куча всегда имеет высоту logn, где n — количество элементов

На рисунке представлена куча типа max-heap, основанная на следующем правиле: дочерние элементы меньше родительского. Существуют также кучи min-heap, где дочерние элементы всегда больше родительского.

Несколько простых функций для работы с кучами:

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Максимальное количество проходов цикла while равно высоте дерева, или logn, следовательно, трудоемкость алгоритма — O(logn).

Извлечение максимального элемента кучи
Первый элемент в куче — всегда максимальный, так что мы просто удалим его (предварительно запомнив), и заменим самым нижним. Затем мы приведем кучу в правильный порядок, используя функцию:

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

И вновь максимальное количество вызовов функции maxHeapify равно высоте дерева, или logn, а значит трудоемкость алгоритма — O(logn).

Делаем кучу из любого рандомного массива
Окей, есть два пути сделать это. Первый — поочередно вставлять каждый элемент в кучу. Это просто, но совершенно неэффективно. Трудоемкость алгоритма в этом случае будет O(nlogn), т.к. функция O(logn) будет выполняться n раз.

Более эффективный способ — применить функцию maxHeapify для ‘под-кучи’, от (currSize/2) до первого элемента.

Сложность получится O(n), и доказательство этого утверждения, к сожалению, выходит за рамки данной статьи. Просто поймите, что элементы, находящиеся в части кучи от currSize/2 до currSize, не имеют потомков, и большинство образованных таким образом ‘под-куч’ будут высотой меньше, чем logn.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Действительно, зачем это все?

Кучи нужны для реализации особого типа сортировки, называемого, как ни странно, “сортировка кучей”. В отличие от менее эффективных “сортировки вставками” и “сортировки пузырьком”, с их ужасной сложностью в O(n 2 ), “сортировка кучей” имеет сложность O(nlogn).

Реализация до неприличия проста. Просто продолжайте последовательно извлекать из кучи максимальный (корневой) элемент, и записывайте его в массив, пока куча не опустеет.

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

Легко, не правда ли? А вот и празднующая Лупи!

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Лупи хочет научить своих детишек различать фигуры и цвета. Для этого она принесла домой огромное количество разноцветных фигур.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Через некоторое время черепашки окончательно запутались

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Поэтому она достала еще одну игрушку, чтобы немного упростить процесс

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

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

Допустим, номер столба вычисляется следующим образом:

Фиолетовый треугольник
ф+и+о+т+р+е = 22+10+16+20+18+6 = Столб 92

Красный прямоугольник
к+р+а+п+р+я = 12+18+1+17+18+33 = Столб 99

Мы знаем, что 6*33 = 198 возможных комбинаций, значит нам нужно 198 столбов.

Назовем эту формулу для вычисления номера столба — Хеш-функцией.

(с кириллицей немного сложнее, но я оставил так для простоты. — прим.пер.)

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

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Это пример хеш-таблицы, где местоположение элементов определяется хеш-функцией.
При таком подходе время, затраченное на поиск любого элемента, не зависит от количества элементов, т.е. O(1). Другими словами, время поиска в хеш-таблице — константная величина.

Ладно, но допустим мы ищем “карамельный прямоугольник” (если, конечно, цвет “карамельный” существует).

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

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

Ключ к хорошей хеш-таблице — выбрать подходящую хеш-функцию. Бесспорно, это самая важная вещь в создании хеш-таблицы, и люди тратят огромное количество времени на разработку качественных хеш-функций.
В хороших таблицах ни одна позиция не содержит более 2-3 элементов, в обратном случае, хеширование работает плохо, и нужно менять хеш-функцию.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

Еще раз, поиск, не зависящий от количества элементов! Мы можем использовать хеш-таблицы для всего, что имеет гигантские размеры.

Хеш-таблицы также используются для поиска строк и подстрок в больших кусках текста, используя алгоритм Рабина-Карпа или алгоритм Кнута-Морриса-Пратта, что полезно, например, для определения плагиата в научных работах.

Что такое структурирование данных. Смотреть фото Что такое структурирование данных. Смотреть картинку Что такое структурирование данных. Картинка про Что такое структурирование данных. Фото Что такое структурирование данных

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

Переведено для Хабра запертым на чердаке программистом.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *