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

8.2. Осуществление приоритетной очереди со списком 331

размер (): Возвратите ряд элементов в приоритетной очереди.

пустой (): Возвратитесь верный, если приоритетная очередь - пустой и ложный oth-

erwise.

продвиньтесь (e): Вставьте e в приоритетную очередь.

вершина (): Возвратите постоянную ссылку на самый большой элемент

приоритетная очередь.

популярность (): Удалите элемент наверху приоритетной очереди.

Кроме различий в именах функции, наиболее значительной разнице между нашим интерфейсом и приоритетной очередью STL то, что вершина функций и популярность получают доступ к самому большому пункту в очереди согласно первоочередному заказу, а не самому маленькому. Пример использования приоритетной очереди STL показывают в Кодовом Фрагменте 8.6.

приоритетная очередь <Point2D, вектор <Point2D>, LeftRight> p2; p2.push (Point2D (8.5, 4.6)); //добавляют три пункта на p2 p2.push (Point2D (1.3, 5.7)); p2.push (Point2D (2.5, 0.6)); суд <<p2.top () <<endl; p2.pop (); //продукция: (8.5, 4.6) суд <<p2.top () <<endl; p2.pop (); //продукция: (2.5, 0.6) суд <<p2.top () <<endl; p2.pop (); //продукция: (1.3, 5.7)

Кодовый Фрагмент 8.6: пример использования приоритетной очереди STL.

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

8.2

Осуществление приоритетной очереди со списком

В этой секции мы показываем, как осуществить приоритетную очередь, храня ее элементы в списке STL. (Вспомните эту структуру данных из Раздела 6.2.4.) Мы рассматриваем две реализации, в зависимости от того, сортируем ли мы элементы списка.

Внедрение с несортированным списком

Давайте сначала рассмотрим внедрение приоритетной очереди P несортированным вдвойне

связанный список L. Простой способ выполнить операционную вставку (e) на P, добавляя каждый новый элемент в конце L, выполняя функцию L.push назад (e). Это внедрение вставки берет O (1) время.

332

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

Так как вставка не рассматривает значения ключа, получающийся список L не сортирован. Как следствие, чтобы выступить или операционной минуты или removeMin на P, мы должны осмотреть все записи списка, чтобы найти один с минимальным значением ключа. Таким образом минута функций и removeMin берут O (n) время каждый, где n - ряд элементов в P в то время, когда функция выполнена. Кроме того, каждая из этих функций бежит вовремя пропорциональный n даже в лучшем случае, так как каждый из них требует, чтобы поиск всего списка нашел самый маленький элемент. Используя примечание Раздела 4.2.3, мы можем сказать, что эти функции управляют вQ (n) временем. Мы осуществляем размер функций и пустой, просто возвращая продукцию соответствующего func-tions выполненный в списке L. Таким образом, при помощи несортированного списка, чтобы осуществить приоритетную очередь, мы достигаем постоянно-разовой вставки, но линейно-разового поиска и удаления.

Внедрение с сортированным списком

Альтернативное внедрение приоритетной очереди P также использует список L, за исключением того, что на сей раз позволенный нас сохранить элементы, сортированные их значениями ключа. Определенно, мы, которых repre-послал приоритетной очереди P при помощи списка L элементов, сортированных, неуменьшив значения ключа, что означает, что у первого элемента L есть самый маленький ключ.

Мы можем осуществить минуту функции в этом случае, получая доступ к элементу, связанному с первым элементом списка с начать функцией L. Аналогично, мы можем осуществить removeMin функцию P как фронт L.pop (). Предполагая, что L осуществлен как вдвойне связанный список, операционная минута и removeMin в P берут O (1) время, довольно эффективны - также.

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

Таблица 8.1 сравнивает продолжительность функций приоритетной реальной очереди - ized посредством несортированного и сортированного списка, соответственно. Между двумя функциями есть интересный контраст. Несортированный список допускает быстрые вставки, но медленные вопросы и удаления, в то время как сортированный список допускает быстрые вопросы и удаления, но медленные вставки.

Операция

Несортированный список

Сортированный список

размер, пустой

O (1)

O (1)

вставка

O (1)

O (n)

минута, removeMin

O (n)

O (1)

Таблица 8.1: продолжительность худшего случая функций приоритетной очереди размера n,

реализованный посредством несортированного или сортированного списка, соответственно. Мы предполагаем, что список осуществлен вдвойне связанным списком. Космическое требование - O (n).