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

8.4. Приспосабливаемые приоритетные очереди 357

8.4 Приспосабливаемые приоритетные очереди

Функции приоритетной очереди ADT, данный в Разделе 8.1.3, достаточны для большинства основных применений приоритетных очередей, таких как сортировка. Однако есть situ - ations, где дополнительные функции были бы полезны как показано в сценариях ниже этого, обращаются к резервному заявлению пассажира авиакомпании.

• Резервный пассажир с пессимистическим отношением может устать от ожидания

и решите уехать перед останавливающимся временем, прося быть удаленными

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

• Другой резервный пассажир считает ее золото частым - fl ваша карта и показывает его

агент. Таким образом ее приоритет должен быть изменен соответственно. Достигнуть этого

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

Функции приспосабливаемой приоритетной очереди ADT

Вышеупомянутые сценарии мотивируют определение нового ADT для приоритетных очередей,

который включает функции для изменения или удаления указанных записей. Чтобы сделать это, нам нужен некоторый способ указать, какой вход очереди должен быть затронут операцией. Обратите внимание на то, что мы не можем использовать значение ключа входа, потому что ключи не отличны. Вместо этого мы предполагаем, что приоритетная операционная вставка очереди (e) является августом - чеканил так, чтобы, после вставки элемента e, это возвратило ссылку на недавно созданный вход, названный положением (вспомните Раздел 6.2.1). Это положение постоянно присоединено к входу, так, чтобы, даже если местоположение входа изменяется в пределах внутренней структуры данных очереди приоритета (как сделан, выступая пузырящийся oper-ations в куче), положение осталось фиксированным к этому входу. Таким образом положения предоставляют нам средство уникально определить вход, к которому применена каждая операция.

Мы формально определяем приспосабливаемую приоритетную очередь P, чтобы быть приоритетной очередью, которую в дополнение к стандартным приоритетным операциям очереди поддержки следующее увеличивает - монетные дворы.

вставка (e): Вставьте элемент e в P и возвратите обращение положения

к его входу.

удалите (p): Удалите вход, на который ссылается p от P.

замените (p, e): Замените e элемент, связанный с входом касательно -

erenced p и возвращением положение измененного входа.

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

8.4.1 Основанное на списке внедрение

В этой секции мы представляем простое внедрение приспосабливаемой приоритетной очереди,

названный AdaptPriorityQueue. Наше внедрение - обобщение сортированного - приоритетное внедрение очереди списка, данное в Разделе 8.2.

В Кодовом Фрагменте 8.7, мы представляем определение класса, за исключением Позиции класса, которая представлена позже. Общественная часть класса - по существу то же самое как стандартный приоритетный интерфейс очереди, который был представлен в Кодовом Фрагменте 8.4, вместе с новыми функциями удаляют и заменяют. Обратите внимание на то, что вставка функции теперь возвращает положение.

шаблон <typename E, typename C>

класс AdaptPriorityQueue

защищенный:

станд. typedef:: список <E> ElementList; общественность:

//.. определение класса Положения .insert здесь общественность:

международный размер () константа; пустой bool () константа; константа E& минута () константа; вставка Положения (константа E& e); пустота removeMin (); пустота удаляет (константа Position& p); Положение заменяет (константа Position& p, константа

частный:

ElementList L; C isLess;

;

//приспосабливаемая приоритетная очередь

//список элементов

//ряд элементов//действительно ли очередь пуст? / / ми ni мама el ement//элемент вставки//удаляет минимум//, удаляют в положении p E& e);//заменяют в положении p

//приоритетное содержание очереди//меньше компаратор

Кодовый Фрагмент 8.19: определение класса для приспосабливаемой приоритетной очереди.

Мы затем определяем Положение класса, которое вложено в пределах общественной части

класс AdaptPriorityQueue. Его участник данных - iterator к списку STL. Этот список содержит содержание приоритетной очереди. Главный общественный участник - функция, которая возвращается, «константа» ссылаются на основной элемент, который осуществлен, перегрузив «*» оператор. Это представлено в Кодовом Фрагменте 8.20.

Положение класса

частный:

typename ElementList:: iterator q; общественность:

константа E& оператор* ()возвращается *q;

друг класс AdaptPriorityQueue;

;

//положение в очереди

//положение в списке

//элемент в этом положении//предоставляет доступ

Кодовый Фрагмент 8.20: класс, представляющий положение в AdaptPriorityQueue.