WikiDer > Двусторонняя приоритетная очередь - Википедия

Double-ended priority queue - Wikipedia

В Информатика, а двусторонняя приоритетная очередь (DEPQ)[1] или же двусторонняя куча[2] это структура данных похожий на приоритетная очередь или же куча, но позволяет эффективно удалять как максимум, так и минимум, в соответствии с некоторым порядком на ключи (элементы) хранятся в структуре. Каждый элемент в DEPQ имеет приоритет или значение. В DEPQ можно удалять элементы как в возрастающем, так и в убывающем порядке.[3]

Операции

Двусторонняя приоритетная очередь включает следующие операции:

пусто()
Проверяет, пуст ли DEPQ, и возвращает истину, если он пуст.
размер()
Возвращает общее количество элементов, присутствующих в DEPQ.
getMin ()
Возвращает элемент с наименьшим приоритетом.
getMax ()
Возвращает элемент с наивысшим приоритетом.
положить(Икс)
Вставляет элемент Икс в DEPQ.
removeMin ()
Удаляет элемент с минимальным приоритетом и возвращает этот элемент.
removeMax ()
Удаляет элемент с максимальным приоритетом и возвращает этот элемент.

Если операция должна выполняться над двумя элементами, имеющими одинаковый приоритет, то выбирается элемент, вставленный первым. Кроме того, приоритет любого элемента может быть изменен после того, как он был вставлен в DEPQ.[4]

Выполнение

Двусторонние очереди с приоритетом могут быть построены из сбалансированные бинарные деревья поиска (где минимальный и максимальный элементы - это крайний левый и крайний правый лист соответственно) или с использованием специализированных структур данных, таких как min-max куча и куча сопряжения.

Общие методы получения очереди с двусторонним приоритетом из очередей с обычным приоритетом:[5]

Метод двойной структуры

Двойная структура с 14,12,4,10,8 членами DEPQ.[1]

В этом методе поддерживаются две разные очереди приоритетов для min и max. Одни и те же элементы в обоих PQ показаны с помощью указателей соответствия.
Здесь минимальный и максимальный элементы - это значения, содержащиеся в корневых узлах минимальной и максимальной кучи соответственно.

  • Удаление элемента min: Выполнить removemin () в минимальной куче и удалить (значение узла) в максимальной куче, где значение узла - это значение в соответствующем узле в максимальной куче.
  • Удаление максимального элемента: Выполните removemax () для максимальной кучи и удалите (значение узла) на минимальной куче, где значение узла - значение соответствующего узла в минимальной куче.

Общая переписка

Куча полного соответствия для элементов 3, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11 с элементом 11 в качестве буфера.[1]

Половина элементов находится в минимальном PQ, а другая половина - в максимальном PQ. Каждый элемент в min PQ имеет взаимно однозначное соответствие с элементом в max PQ. Если количество элементов в DEPQ нечетное, один из элементов сохраняется в буфере.[1] Приоритет каждого элемента в минимальном PQ будет меньше или равен соответствующему элементу в максимальном PQ.

Лист переписки

Куча листового соответствия для тех же элементов, что и выше.[1]

В этом методе только листовые элементы минимального и максимального PQ образуют соответствующие взаимно однозначные пары. Необязательно, чтобы нелистовые элементы входили в пару взаимно однозначного соответствия.[1]

Интервальные кучи

Реализация DEPQ с использованием интервальной кучи.

Помимо вышеупомянутых методов соответствия, DEPQ могут быть эффективно получены с использованием интервальных куч.[6] Интервальная куча похожа на встроенный min-max куча в котором каждый узел содержит два элемента. Это полное двоичное дерево, в котором:[6]

  • Левый элемент меньше или равен правому элементу.
  • Оба элемента определяют закрытый интервал.
  • Интервал, представленный любым узлом, кроме корня, является подинтервалом родительского узла.
  • Элементы с левой стороны определяют мин куча.
  • Элементы с правой стороны определяют максимальная куча.

В зависимости от количества элементов возможны два случая[6] -

  1. Четное количество элементов: В этом случае каждый узел содержит два элемента, например п и q, с п ≤ q. Тогда каждый узел представлен интервалом [пq].
  2. Нечетное количество элементов: В этом случае каждый узел, кроме последнего, содержит два элемента, представленных интервалом [пq], тогда как последний узел будет содержать единственный элемент и представлен интервалом [пп].

Вставка элемента

В зависимости от количества элементов, уже присутствующих в куче интервалов, возможны следующие случаи:

  • Нечетное количество элементов: Если количество элементов в куче интервалов нечетное, новый элемент сначала вставляется в последний узел. Затем он последовательно сравнивается с предыдущими узловыми элементами и тестируется на соответствие критериям, необходимым для интервальной кучи, как указано выше. В случае, если элемент не удовлетворяет ни одному из критериев, он перемещается из последнего узла в корень, пока не будут выполнены все условия.[6]
  • Четное количество элементов: Если количество элементов четное, то для вставки нового элемента создается дополнительный узел. Если элемент попадает слева от родительского интервала, он считается находящимся в минимальной куче, а если элемент попадает справа от родительского интервала, он считается в минимальной куче. максимальная куча. Далее он последовательно сравнивается и перемещается от последнего узла к корню, пока не будут выполнены все условия для интервальной кучи. Если элемент лежит в пределах интервала самого родительского узла, то процесс останавливается и там сам и перемещение элементов не происходит.[6]

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

Удаление элемента

  • Элемент Min: В интервальной куче минимальный элемент - это элемент слева от корневого узла. Этот элемент удаляется и возвращается. Чтобы заполнить вакансию, созданную в левой части корневого узла, элемент из последнего узла удаляется и повторно вставляется в корневой узел. Затем этот элемент последовательно сравнивается со всеми левыми элементами нисходящих узлов, и процесс останавливается, когда выполнены все условия для интервальной кучи. В случае, если элемент левой стороны в узле становится больше элемента правой стороны на любом этапе, два элемента меняются местами.[6] а затем проводятся дальнейшие сравнения. Наконец, корневой узел снова будет содержать минимальный элемент с левой стороны.
  • Максимальный элемент: В интервальной куче максимальный элемент - это элемент справа от корневого узла. Этот элемент удаляется и возвращается. Чтобы заполнить вакансию, созданную справа от корневого узла, элемент из последнего узла удаляется и повторно вставляется в корневой узел. Дальнейшие сравнения проводятся на аналогичной основе, как описано выше. Наконец, корневой узел снова будет содержать элемент max с правой стороны.

Таким образом, с помощью интервальных куч можно эффективно удалять как минимальные, так и максимальные элементы, переходя от корня к листу. Таким образом, можно получить DEPQ.[6] из интервальной кучи, где элементы интервальной кучи являются приоритетами элементов в DEPQ.

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

Интервальные кучи

Когда DEPQ реализованы с использованием интервальных куч, состоящих из п элементы, временные сложности для различных функций сформулированы в таблице ниже[1]

ОперацияСложность времени
в этом( )На)
пусто( )О (1)
getmin ()О (1)
getmax ()О (1)
размер( )О (1)
вставить (х)O (журнал п)
removeMin ()O (журнал п)
removeMax ()O (журнал п)

Сопряжение кучи

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

ОперацияСложность времени
пусто( )О (1)
getmin ()О (1)
getmax ()О (1)
вставить (х)O (журнал п)
removeMax ()O (журнал п)
removeMin ()O (журнал п)

Приложения

Внешняя сортировка

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

  1. Считайте столько элементов, сколько поместится во внутренний DEPQ. Элементы в DEPQ в конечном итоге станут средней группой (стержнем) элементов.
  2. Прочтите остальные элементы. Если следующий элемент ≤ наименьшего элемента в DEPQ, выведите этот следующий элемент как часть левой группы. Если следующий элемент ≥ самый большой элемент в DEPQ, выведите этот следующий элемент как часть правой группы. В противном случае удалите элемент max или min из DEPQ (выбор может быть сделан случайным образом или поочередно); если максимальный элемент удален, вывести его как часть правой группы; в противном случае вывести удаленный элемент как часть левой группы; вставьте новый элемент ввода в DEPQ.
  3. Выведите элементы в DEPQ в отсортированном порядке как среднюю группу.
  4. Рекурсивно отсортируйте левую и правую группы.

Смотрите также

Рекомендации

  1. ^ а б c d е ж грамм час Структуры данных, алгоритмы и приложения в Java: очереди с двойным приоритетом, Сартадж Сахни, 1999.
  2. ^ Брасс, Питер (2008). Расширенные структуры данных. Издательство Кембриджского университета. п. 211. ISBN 9780521880374.
  3. ^ «Depq - очередь с двусторонним приоритетом». Архивировано из оригинал на 2012-04-25. Получено 2011-10-04.
  4. ^ "depq".
  5. ^ Основы структур данных в C ++ - Эллис Хоровиц, Сартадж Сахни и Динеш Мехта
  6. ^ а б c d е ж грамм http://www.mhhe.com/engcs/compsci/sahni/enrich/c9/interval.pdf