Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

8.1. Приоритетный тип данных резюме очереди 329

в очереди, что означает, что ее стоимость может быть прочитана и скопирована, но не изменена.

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

Состояние ошибки происходит, если или минуты функций или removeMin назван на пустой приоритетной очереди. Это сообщено, бросив исключение типа QueueEmpty. Его определение подобно другим, которых мы видели. (См. Кодовый Frag-ment 5.2.)

8.1.5 Сортировка с приоритетной очередью

Другое важное применение приоритетной очереди сортирует, где нам дают a

коллекция L n элементов, которые могут быть сравнены согласно полному отношению заказа, и мы хотим перестроить их в увеличивающемся заказе (или по крайней мере в неуменьшающемся заказе, если есть связи). Алгоритм для сортировки L с приоритетной очередью Q, названный PriorityQueueSort, довольно прост и состоит из следующих двух фаз:

1. В первой фазе мы помещаем элементы L в первоначально пустой приоритет

очередь P через серию n вставляет операции, один для каждого элемента.

2. Во второй фазе мы извлекаем элементы из P в неуменьшающемся заказе

посредством серии n комбинаций минуты и removeMin операций, откладывая их в L в заказе.

Псевдокодекс для этого алгоритма дан в Кодовом Фрагменте 8.5. Это принимает это

L дан как список STL, но кодекс может быть адаптирован к другим контейнерам.

Алгоритм PriorityQueueSort (L, P):

Вход: список L STL n элементов и приоритетной очереди, P, который выдерживает сравнение

элементы используя полную Продукцию отношения заказа: сортированный список L, в то время как! L.empty () делают

e¬ L.front

Фронт L.pop () Удаляют элемент e из спискаP.insert (e) ... и это приоритетной очереди

в то время как! P.empty () делают

e¬ P.min ()

P.removeMin () Удаляют самый маленький элемент e из очередиL.push назад (e) ... и приложите его к задней части L\

Кодовый Фрагмент 8.5: PriorityQueueSort Алгоритма, который сортирует список L STL при помощи приоритетной очереди P.

330

Глава 8. Кучи и приоритетные очереди

Алгоритм работает правильно на любую приоритетную очередь P, независимо от того как P осуществлен. Однако продолжительность алгоритма определена продолжительностью операционной вставки, минута и removeMin, которые действительно зависят от того, как P осуществлен. Действительно, PriorityQueueSort нужно считать больше сортировкой «схемой», чем сортировка «алгоритмом», потому что это не определяет, как приоритетная очередь P осуществлена. Схема PriorityQueueSort - парадигма нескольких популярных алгоритмов сортировки, включая вид выбора, вид вставки и вид кучи, который мы обсуждаем в этой главе.

8.1.6 Приоритетный Класс очереди STL

C ++ Standard Template Library (STL) обеспечивает внедрение pri-ority очередь, названная приоритетной очередью. Как с другими классами STL мы видели, такие как стеки и очереди, приоритетная очередь STL - пример контейнера. Чтобы объявить объект приоритетной очереди типа, необходимо сначала включать файл определения, который называют «очередью». Как с другими объектами STL, pri-ority очередь является частью станд. namespace, и следовательно любой необходимо использовать «станд.:: приоритетная очередь» или предоставлять соответствующее заявление «использования».

Приоритетный класс очереди - templated с тремя параметрами: основной тип элементов, основного контейнера STL, в котором приоритетная очередь сохранена, и объект компаратора. Только первый аргумент шаблона требуется. Второй параметр (основной контейнер) неплатежи к вектору STL. Третий param-эфир (компаратор) неплатежи к использованию стандарта C ++ меньше оператор (» <»). Приоритетная очередь STL использует компараторы таким же образом, когда мы определили в Секунду - tion 8.1.2. В частности компаратор - класс, который отвергает» ()» оператор, чтобы определить булеву функцию, которая осуществляет меньше оператор.

Кодовый фрагмент ниже определяет две приоритетных очереди STL. Первые целые числа магазинов. Двумерные пункты вторых магазинов под слева направо заказом (вспоминают Раздел 8.1.2).

#include <очередь>

использование namespace станд.; //делают станд. доступной приоритетной очередью <интервал> p1; //приоритетная очередь целых чисел

//приоритетная очередь вопросов со слева направо заказывает

приоритетная очередь <Point2D, вектор <Point2D>, LeftRight> p2;

Основные членские функции приоритетной очереди STL даны ниже. Позвольте p, как объявлять, быть приоритетной очередью STL и позволять e обозначить единственный объект, тип которого совпадает с основным типом приоритетной очереди. (Например, p - приоритетная очередь целых чисел, и e - целое число.)