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

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

//лево-правильный компаратор

оператор bool () (константа Point2D& p, константа Point2D& q) константа

возвращают p.getX () <q.getX ();

;

класс BottomTop //главный основанием компаратор

общественность:

оператор bool () (константа Point2D& p, константа Point2D& q) константа

возвращают p.getY () <q.getY ();

;

Кодовый Фрагмент 8.1: Два класса компаратора для сравнения пунктов. Первый imple-чеканит слева направо заказ и вторые орудия заказ основания к вершине.

участники данных. Они используются исключительно в целях определить особого оператора сравнения. Учитывая два объекта p и q, каждый тип Point2D, чтобы проверить, является ли p налево от q, мы призвали бы leftRight (p, q), и проверить, является ли p ниже q, мы призвали бы bottomTop (p, q). Каждый призывает» ()» оператор для соответствующего класса.

Затем, давайте посмотрим, как мы можем использовать наши компараторы, чтобы осуществить два различных быть - haviors. Считайте универсальную функцию printSmaller показанной в Кодовом Фрагменте 8.2. Это печатает меньшие из своих двух аргументов. Определение функции - templated типом E элемента и типом C компаратора. Класс компаратора, как предполагается, осуществляет меньше функция для двух объектов типа E. Функции дают три аргумента, эти два элемента p и q, который будет сравнен и случай острова компаратора для этих элементов. Функция призывает компаратор, чтобы определить, какой элемент меньше, и затем печатает эту стоимость.

шаблон <typename E, typename C> //тип элемента и компаратор

пустота printSmaller (константа E& p, константа E& q, константа C& isLess)

суд <<(острова (p, q)? p: q) <<endl;//печатают меньший из p и q

Кодовый Фрагмент 8.2: универсальная функция, которая печатает меньшие из двух элементов,

учитывая компаратор для этих элементов.

Наконец, давайте посмотрим, как мы можем применить нашу функцию на два пункта. Кодекс показывают в Кодовом Фрагменте 8.3. Мы объявляем к пунктам p и q и инициализируем их координаты. (Мы не представили определение класса для Point2D, но позволили нам предположить, что конструктору дают x-и y-координаты, и мы предоставили оператору продукции.) Мы тогда объявляем два объекта компаратора, один для слева направо заказа и другого для заказа основания к вершине. Наконец, мы призываем функцию printSmaller на два пункта, изменяя только объекты компаратора в каждом случае.

Заметьте что, в зависимости от которого компаратор обеспечен, требование к func-

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

327

Point2D p (1.3, 5.7), q (2.5, 0.6);

//

два пункта

LeftRight leftRight;

//

лево-правильный компаратор

BottomTop bottomTop;

//

главный основанием компаратор

printSmaller (p, q, leftRight);

//

продукция: (1.3, 5.7)

printSmaller (p, q, bottomTop);

//

продукция: (2.5, 0.6)

Кодовый Фрагмент 8.3: использование двух компараторов, чтобы осуществить различные поведения от функции printSmaller.

tion isLess в функции printSmaller призывает любого» ()» оператор класса Лево-Право или BottomTop. Таким образом мы получаем желаемый результат, два различных быть - haviors для того же самого двумерного класса пункта.

С помощью компараторов программист может написать общее приоритетное внедрение очереди, которое работает правильно в большом разнообразии контекстов. В паритете - ticular, приоритетные очереди, представленные в этой главе, являются универсальными классами, которые являются templated двумя типами, элемент E и компаратор C.

Подход компаратора немного менее общий, чем метод состава, потому что компаратор базирует свои решения о содержании элементов их - сам. В методе состава ключ может содержать информацию, которая не является частью объекта элемента. Подход компаратора имеет преимущество того, чтобы быть sim - pler, так как мы можем вставить элементы непосредственно в нашу приоритетную очередь, не создавая пары ключей элемента. Кроме того, в Упражнении R-8.4 мы показываем, что нет никакой реальной потери общности в использовании компараторов.

8.1.3 Приоритетная очередь ADT

Описав приоритетный тип данных резюме очереди на интуитивном уровне, мы теперь

опишите его более подробно. Как ADT, приоритетная очередь P поддерживает следующие функции:

размер (): Возвратите ряд элементов в пустом P. (): Возвратитесь верный, если P пустой и ложный иначе. вставка (e): Вставьте новый элемент e в P.

минута (): Возвратите ссылку на элемент P с самым маленьким

связанное значение ключа (но не удаляют его); ошибочный довод «против» - dition происходит, если приоритетная очередь пуста.

removeMin (): Удалите из P элемент, на который ссылается минута (); er-

условие ror происходит, если приоритетная очередь пуста.

Как упомянуто выше, первичные функции приоритетной очереди ADT - вставка, минута и removeMin операции. Другие функции, размер и пустой, являются универсальными операциями по коллекции. Обратите внимание на то, что мы позволяем приоритетной очереди иметь многократные записи с тем же самым ключом.

328

Глава 8. Кучи и Приоритетный Пример Очередей 8.4: следующая таблица показывает ряд операций и их эффектов на первоначально пустую приоритетную очередь P. Каждый элемент состоит из целого числа, которое мы принимаем, чтобы быть сортированными согласно естественному заказу целых чисел. Обратите внимание на то, что каждое требование к минуте возвращает ссылку на вход в очереди, не фактическое значение. Хотя «Приоритетная колонна» Очередей показывает пункты в сортированном заказе, приоритетная очередь не должна хранить элементы в этом заказе.

Операция

Продукция

Приоритетная очередь

вставка (5)

-



вставка (9)

-

5, 9

вставка (2)

-

2, 5, 9

вставка (7)

-

2, 5, 7, 9

минута ()

[2]

2, 5, 7, 9

removeMin ()

-

5, 7, 9

размер ()

3

5, 7, 9

минута ()

[5]

5, 7, 9

removeMin ()

-

7, 9

removeMin ()

-



removeMin ()

-



пустой ()

верный



removeMin ()

«ошибка»



8.1.4 C ++ приоритетный интерфейс очереди

Прежде, чем обсудить определенные внедрения приоритетной очереди, мы сначала определяем

неофициальный интерфейс C ++ для приоритетной очереди в Кодовом Фрагменте 8.4. Это не полный C ++ класс, просто декларация государственных функций.

шаблон <typename E, typename C> //элемент и компаратор

класс PriorityQueue //интерфейс приоритетной очереди

общественность:

международный размер () константа;

//

ряд элементов

bool isEmpty () константа;

//

действительно ли очередь пуста?

недействительная вставка (константа E& e);

//

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

константа E& минута () бросок константы (QueueEmpty);

//

ми ni мама el ement

пустота removeMin () бросок (QueueEmpty);

//

удалите минимум

;

Кодовый Фрагмент 8.4: неофициальный интерфейс PriorityQueue (не полный класс).

Хотя тип C компаратора включен как аргумент шаблона, это не появляется в общественном интерфейсе. Конечно, его стоимость относится к любому бетону imple-процесс мышления. Заметьте, что минута функции возвращает постоянную ссылку на элемент