Приоритетные очереди — различия между версиями
Eadm (обсуждение | вклад) |
м (rollbackEdits.php mass rollback) |
||
(не показано 9 промежуточных версий 5 участников) | |||
Строка 1: | Строка 1: | ||
− | '''Приоритетная очередь''' (англ. ''priority queue'') {{---}} это абстрактная структура данных | + | '''Приоритетная очередь''' (англ. ''priority queue'') {{---}} это абстрактная структура данных наподобие стека или очереди, где у каждого элемента есть приоритет. Элемент с более высоким приоритетом находится перед элементом с более низким приоритетом. Если у элементов одинаковые приоритеты, они располагаются в зависимости от своей позиции в очереди. Обычно приоритетные очереди реализуются с помощью '''куч''' (англ. ''heap''). |
==Операции== | ==Операции== | ||
Приоритетные очереди поддерживают следующие операции: | Приоритетные очереди поддерживают следующие операции: | ||
Строка 15: | Строка 15: | ||
===Обычная=== | ===Обычная=== | ||
Для лучшей производительности приоритетные очереди реализуют с помощью куч, что позволяет выполнять операции вставки и удаления за <tex>O(\log n)</tex>. Использование специальных куч, таких как Фибоначчиева куча и спаренная куча, позволяет еще больше улучшить асимптотику некоторый операций. | Для лучшей производительности приоритетные очереди реализуют с помощью куч, что позволяет выполнять операции вставки и удаления за <tex>O(\log n)</tex>. Использование специальных куч, таких как Фибоначчиева куча и спаренная куча, позволяет еще больше улучшить асимптотику некоторый операций. | ||
− | ==Виды | + | ==Виды приоритетных очередей== |
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
Строка 73: | Строка 73: | ||
|- | |- | ||
| [[Биномиальная куча]] | | [[Биномиальная куча]] | ||
− | |||
| align="center" | <tex>O(\log n)</tex> | | align="center" | <tex>O(\log n)</tex> | ||
| align="center" | <tex>O(\log n)</tex> | | align="center" | <tex>O(\log n)</tex> | ||
− | | align="center" | <tex>O( | + | | align="center" | <tex>O(\log n)</tex> |
+ | | align="center" | <tex>O(\log n)</tex> | ||
| [[Биномиальная куча]] (англ. ''binomial heap'') {{---}} структура данных, реализующая приоритетную очередь, которая представляет собой набор биномиальных деревьев с двумя свойствами: | | [[Биномиальная куча]] (англ. ''binomial heap'') {{---}} структура данных, реализующая приоритетную очередь, которая представляет собой набор биномиальных деревьев с двумя свойствами: | ||
* ключ каждой вершины не меньше ключа ее родителя | * ключ каждой вершины не меньше ключа ее родителя | ||
Строка 109: | Строка 109: | ||
| [[Тонкая куча]] (англ. ''thin heap'') {{---}} это структура данных, реализующая приоритетную очередь с теми же асимптотическими оценками, что и [[фибоначчиева куча]], но имеющая большую практическую ценность из-за меньших констант. | | [[Тонкая куча]] (англ. ''thin heap'') {{---}} это структура данных, реализующая приоритетную очередь с теми же асимптотическими оценками, что и [[фибоначчиева куча]], но имеющая большую практическую ценность из-за меньших констант. | ||
|- | |- | ||
− | | [[ | + | | [[Сонная куча]] |
| align="center" | <tex>O(1)</tex> | | align="center" | <tex>O(1)</tex> | ||
| align="center" | <tex>O(\log n)</tex> | | align="center" | <tex>O(\log n)</tex> | ||
Строка 124: | Строка 124: | ||
|- | |- | ||
|} | |} | ||
+ | |||
==Применение== | ==Применение== | ||
Приоритетные очереди используются в следующих алгоритмах: [[алгоритм Дейкстры]], [[алгоритм Прима]], дискретно-событийное моделирование (англ. ''discrete-event simulation, DES'')<ref>[http://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE-%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9%D0%BD%D0%BE%D0%B5_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 Wikipedia {{---}} Дискретно-событийное моделирование]</ref>, [[алгоритм Хаффмана]], поиск по первому наилучшему совпадению, управление полосой пропускания. | Приоритетные очереди используются в следующих алгоритмах: [[алгоритм Дейкстры]], [[алгоритм Прима]], дискретно-событийное моделирование (англ. ''discrete-event simulation, DES'')<ref>[http://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE-%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9%D0%BD%D0%BE%D0%B5_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 Wikipedia {{---}} Дискретно-событийное моделирование]</ref>, [[алгоритм Хаффмана]], поиск по первому наилучшему совпадению, управление полосой пропускания. | ||
Строка 142: | Строка 143: | ||
<references /> | <references /> | ||
== Источники информации == | == Источники информации == | ||
− | * [http://en.wikipedia.org/wiki/Heap_(data_structure) | + | * [http://en.wikipedia.org/wiki/Heap_(data_structure) Wikipedia {{---}} Heap (data structure)] |
− | * [http://en.wikipedia.org/wiki/2%E2%80%933_heap | + | * [http://en.wikipedia.org/wiki/2%E2%80%933_heap Wikipedia {{---}} 2-3 heap] |
− | * [http://en.wikipedia.org/wiki/Beap | + | * [http://en.wikipedia.org/wiki/Beap Wikipedia {{---}} Beap] |
− | * [http://en.wikipedia.org/wiki/Binary_heap | + | * [http://en.wikipedia.org/wiki/Binary_heap Wikipedia {{---}} Binary heap] |
− | * [http://en.wikipedia.org/wiki/Binomial_heap | + | * [http://en.wikipedia.org/wiki/Binomial_heap Wikipedia {{---}} Binomial heap] |
− | * [http://en.wikipedia.org/wiki/Brodal_queue | + | * [http://en.wikipedia.org/wiki/Brodal_queue Wikipedia {{---}} Brodal queue] |
− | * [http://en.wikipedia.org/wiki/D-ary_heap | + | * [http://en.wikipedia.org/wiki/D-ary_heap Wikipedia {{---}} <tex>d</tex>-ary heap] |
− | * [http://en.wikipedia.org/wiki/Fibonacci_heap | + | * [http://en.wikipedia.org/wiki/Fibonacci_heap Wikipedia {{---}} Fibonacci heap] |
[[Категория: Дискретная математика и алгоритмы]] | [[Категория: Дискретная математика и алгоритмы]] | ||
[[Категория: Приоритетные очереди]] | [[Категория: Приоритетные очереди]] | ||
[[Категория: Структуры данных]] | [[Категория: Структуры данных]] |
Текущая версия на 19:07, 4 сентября 2022
Приоритетная очередь (англ. priority queue) — это абстрактная структура данных наподобие стека или очереди, где у каждого элемента есть приоритет. Элемент с более высоким приоритетом находится перед элементом с более низким приоритетом. Если у элементов одинаковые приоритеты, они располагаются в зависимости от своей позиции в очереди. Обычно приоритетные очереди реализуются с помощью куч (англ. heap).
Содержание
Операции
Приоритетные очереди поддерживают следующие операции:
- или — поиск элемента с наибольшим приоритетом,
- или — вставка нового элемента,
- или — извлечь элемент с наибольшим приоритетом,
- или — удалить элемент с наибольшим приоритетом,
- или — обновить значение элемента,
- — объединение двух приоритетных очередей, сохраняя оригинальные очереди,
- — объединение двух приоритетных очередей, разрушая оригинальные очереди,
- — разбить приоритную очередь на две части.
Реализации
Наивная
В качестве наивной реализации мы можем взять обычный список и при добавлении нового элемента класть его в конец, а при запросе элемента с максимальным приоритетом проходить по всему списку. Тогда операция
будет выполняться за , а или за .Обычная
Для лучшей производительности приоритетные очереди реализуют с помощью куч, что позволяет выполнять операции вставки и удаления за
. Использование специальных куч, таких как Фибоначчиева куча и спаренная куча, позволяет еще больше улучшить асимптотику некоторый операций.Виды приоритетных очередей
Название | Операции | Описание | |||
---|---|---|---|---|---|
Наивная реализация (неотсортированный список) | Наивная реализация с использованием списка. | ||||
Наивная реализация (отсортированный массив) | Наивная реализация с использованием отсортированного массива. | ||||
Двуродительская куча | Двуродительская куча (англ. bi-parental heap или beap) — такая куча, где у каждого элемента обычно есть два ребенка (если это не последний уровень) и два родителя (если это не первый уровень). Структура позволяет производить сублиненый поиск. | ||||
Двоичная куча | Двоичная куча (англ. binary heap) — такое двоичное дерево, для которого выполнены три условия:
| ||||
-арная куча | (англ. -арная куча -ary heap) — двоичная куча, в которой у каждого элемента детей вместо . | ||||
Левосторонняя куча | Левосторонняя куча (англ. leftist heap) — двоичное левосторонее дерево (не обязательно сбалансированное), но с соблюдением порядка кучи. | ||||
Биномиальная куча | Биномиальная куча (англ. binomial heap) — структура данных, реализующая приоритетную очередь, которая представляет собой набор биномиальных деревьев с двумя свойствами:
| ||||
Спаренная куча | Спаренная куча (англ. pairing heap) — куча с относительно простой реализацией и хорошей производительностью, может быть рассмотрена как упрощенная Фибоначчиева куча. | ||||
Толстая куча | Толстая куча — это почти кучеобразный нагруженный лес. | ||||
2-3 куча | Структура похожа на Фибоначчиеву кучу и использует в своей реализации 2-3 дерево. | ||||
Тонкая куча | Тонкая куча (англ. thin heap) — это структура данных, реализующая приоритетную очередь с теми же асимптотическими оценками, что и фибоначчиева куча, но имеющая большую практическую ценность из-за меньших констант. | ||||
Сонная куча | Куча, построенная на основе Фибоначчиева дерева. Фибоначчиево дерево (англ. Fibonacci tree) — биномиальное дерево, где у каждой вершины удалено не более одного ребенка. | ||||
Куча Бродала-Окасаки | Куча Бродала-Окасаки (англ. Brodal's and Okasaki's Priority Queue) — основана на использовании биномиальной кучи без каскадных ссылок, добавлении минимального элемента и на идеи Data-structural bootstrapping. |
Применение
Приоритетные очереди используются в следующих алгоритмах: алгоритм Дейкстры, алгоритм Прима, дискретно-событийное моделирование (англ. discrete-event simulation, DES)[1], алгоритм Хаффмана, поиск по первому наилучшему совпадению, управление полосой пропускания.
Реализации в языках программирования
- Стандартная библиотека шаблонов[2] (англ. STL) в C++ предоставляет методы управления кучей make_heap, push_heap и pop_heap (обычно реализуются бинарные кучи), которые оперируют с итераторами произвольного случайного доступа. Методы используют итераторы как ссылки на массивы и выполняют преобразование массив-куча.
- Библиотека Boost[3] для C++ включает в себя библиотеку для работу с кучами. В отличии от STL, поддерживает операции decrease-key и increase-key, а также имеет поддержку дополнительных видов куч, таких как фибоначчиева куча, биномиальная куча и спаренная куча.
- В Java 2 (начиная с версии 1.5) предоставляется реализация бинарной кучи в классе java.util.PriorityQueue<E>[4], который не поддерживает операции decrease-key и increase-key.
- Python имеет модуль heapq[5], который реализует очереди с приоритетами с помощью бинарной кучи.
- PHP имеет поддержку кучи на максимум SplMaxHeap[6] и кучи на минимум SplMinHeap[7], как часть Standard PHP Library начиная с версии 5.3.
- В Perl имеются реализации[8] бинарной, биномиальной и фибоначчиевой куч во всеобъемлющей сети архивов.
- Go имеет пакет heap[9], в котором реализованы алгоритмы для работы с кучами.