Сообщество - Типичный программист
Добавить пост

Типичный программист

991 пост 6 255 подписчиков

Популярные теги в сообществе:

Бинарная куча и приоритетная очередь


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

❓ Что это такое “Приоритетная очередь”

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

Приоритетная очередь поддерживает те же операции, что и обычная очередь.

❓ Что это такое “Бинарная (двоичная) куча”

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

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

Можно сказать, что приоритетная очередь — это интерфейс, а бинарная куча — одна из возможных реализаций интерфейса “приоритетной очереди”.

💡 О том, как происходит добавление и удаление элементов из бинарной кучи описано в статье на хабре Структуры данных: двоичная куча (binary heap)

🧑‍💻 Собеседования

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

Например:

- В .NET 6 появилась встроенная реализация приоритетной очереди, она так и называется PriorityQueue
- А вот в JavaScript из коробки в нет подобной реализации

В таком случае можно быстро реализовать приоритетную очередь с помощью динамического массива:

- Описать класс PriorityQueue, у которого под капотом используется динамический массив
- Метод Enqueue — добавляет элемент в конец динамического массива
- Метод Dequeue — извлекает элемент с наименьшим приоритетом

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

⌨️ Пример задачи с Leetcode

Чтобы понять как и зачем использовать приоритетную очередь можно порешать следующие задачи на Leetcode

1. Top K Frequent Words
2. Top K Frequent Elements

Еще по теме:

- .NET 6: PriorityQueue
- Top K Frequent Words - Priority Queue Approach (LeetCode)

#algorithms #interview

https://t.me/cherkashindev/115

Показать полностью

Нечто

Народ, просветите, что это за код? Появляется на странице в вк, с мобильного.

<span class="FeedSliderTabs__tab_text TopMenu__text">Новости</span><span class="FeedSliderTabs__chevron"><div aria-hidden="true" class="svgIcon svgIcon-dropdown_outline_16"><svg fill="none" height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 6.78 3.77-3.1a.75.75 0 1 1 .96 1.15l-4.25 3.5a.75.75 0 0 1-.96 0l-4.25-3.5a.75.75 0 0 1 .96-1.16z" fill="currentColor"/></svg></div></span>

А ведь лиду еще с ними со всем как-то работать

А ведь лиду еще с ними со всем как-то работать

И в чем он не прав?

И в чем он не прав?

«Работать, нельзя отдыхать» или «работать нельзя, отдыхать»?

«Работать, нельзя отдыхать» или «работать нельзя, отдыхать»?

«А мне свой нерабочий код важнее прода»

«А мне свой нерабочий код важнее прода»

Когда показываешь лиду свой хороший код:

Когда показываешь лиду свой хороший код: IT юмор, Программирование, IT, Картинка с текстом, Stack overflow, Git, ChatGPT
Показать полностью 1

Ошибся скрам, а страдают разрабы

Ошибся скрам, а страдают разрабы IT юмор, Программирование, IT, Картинка с текстом, Скрам, Индиана Джонс
Показать полностью 1
Отличная работа, все прочитано!