Книжный каталог

Очереди с приоритетами

Перейти в магазин

Сравнить цены

Категория: Книги

Описание

Книга известного специалиста по теории очередей Н. Джейсуола - одна из первых в мировой литературе монографий, специально посвященная задачам обслуживания с приоритетом. Наряду с уже решенными проблемами в нее включены задачи, которые еще предстоит решить. В русское издание включено дополнение, содержащее результаты, полученные после выхода английского издания. Книга представляет интерес для всех математиков, занимающихся математическими вопросами теории массового обслуживания и смежными вопросами, а также для специалистов по теории массового обслуживания. Она доступна аспирантам и студентам старших курсов. ОГЛАВЛЕНИЕ: От редактора перевода. Предисловие. Глава I. Основная модель с бесконечным источником. Глава II. Основная модель с конечным источником. Глава III. Модели очередей с приоритетами. Глава IV. Дисциплины обслуживания с абсолютным приоритетом. Глава V. Дисциплина обслуживания с относительным приоритетом. Глава VI. Дисциплина обслуживания со смешанным приоритетом. Глава VII. Д

Сравнить Цены

Предложения интернет-магазинов
Творческий коллектив шоу «Сергей Стиллавин и его друзья» Феномен очереди Творческий коллектив шоу «Сергей Стиллавин и его друзья» Феномен очереди 49 р. litres.ru В магазин >>
Наталья Мойсик Чем увлечь ребенка в очереди, поликлинике, машине? Наталья Мойсик Чем увлечь ребенка в очереди, поликлинике, машине? 47 р. ozon.ru В магазин >>
Рукавичка Рукавичка 105 р. ozon.ru В магазин >>
Диченскова А. Чем занять ребенка в очереди Игры считалки потешки Диченскова А. Чем занять ребенка в очереди Игры считалки потешки 82 р. chitai-gorod.ru В магазин >>
Мойсик Н. Чем увлечь ребенка в очереди поликлинике машине Мойсик Н. Чем увлечь ребенка в очереди поликлинике машине 81 р. chitai-gorod.ru В магазин >>
В. И. Карпунин Государство и конкурентоспособность национальной банковской системы В. И. Карпунин Государство и конкурентоспособность национальной банковской системы 79.9 р. litres.ru В магазин >>
Михаил Ефимов Беседы о главном Михаил Ефимов Беседы о главном 89.9 р. litres.ru В магазин >>

Статьи, обзоры книги, новости

Очередь с приоритетом (программирование)

Очередь с приоритетом (программирование)

Очередь с приоритетом (англ. priority queue ) — абстрактный тип данных в программировании, поддерживающий две обязательные операции — добавить элемент и извлечь максимум [1] (минимум). Предполагается, что для каждого элемента можно вычислить его приоритет — действительное число или в общем случае элемент линейно упорядоченного множества [2] .

Содержание

Основные методы, реализуемые очередью с приоритетом, следующие [2] [3] [1] :

  • insert(ключ, значение) — добавляет пару (ключ, значение) в хранилище;
  • extract_minimum() — возвращает пару (ключ, значение) с минимальным значением ключа, удаляя её из хранилища.

При этом меньшее значение ключа соответствует более высокому приоритету.

В некоторых случаях более естественен рост ключа вместе с приоритетом. Тогда второй метод можно назвать extract_maximum() [1] .

Есть ряд реализаций в которых обе основные операции выполняются в худшем случае за время, ограниченное O ( log ? n ) <\displaystyle O(\log n)>(см. «O» большое и «o» малое), где n <\displaystyle n>— количество хранимых пар.

В качестве примера очереди с приоритетом можно рассмотреть список задач работника. Когда он заканчивает одну задачу, он переходит к очередной — самой приоритетной (ключ будет величиной, обратной приоритету) — то есть выполняет операцию извлечения максимума. Начальник добавляет задачи в список, указывая их приоритет, то есть выполняет операцию добавления элемента.

На практике интерфейс очереди с приоритетом нередко расширяют другими операциями [4] [3] :

  • вернуть минимальный элемент без удаления из очереди
  • изменить приоритет произвольного элемента
  • удалить произвольный элемент
  • слить две очереди в одну

В индексированных очередях с приоритетом (адресуемых [5] ) возможно обращение к элементам по индексу. Такие очереди могут быть использованы, например, для слияния нескольких отсортированных последовательностей (multiway merge) [1] .

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

Простейшие (и не очень эффективные) реализации могут использовать неупорядоченный или упорядоченный массив, связный список, подходящие для небольших очередей. При этом вычисления могут быть как «ленивыми» (тяжесть вычислений переносится на извлечение элемента), так и ранними (eager), когда вставка элемента сложнее его извлечения. То есть, одна из операций может быть произведена за время O ( 1 ) <\displaystyle O(1)>, а другая — за O ( N ) <\displaystyle O(N)>, где N — длина очереди в худшем случае [1] .

Более эффективными являются реализации на основе кучи, где обе операции можно производить в худшем случае за время O ( log ? N ) <\displaystyle O(\log N)>[1] . К ним относятся двоичная куча, биномиальная куча, фибоначчиева куча.

Абстрактный тип данных (АТД) для очереди с приоритетом получается из АТД кучи переименованием соответствующих функций. Минимальное (максимальное) значение находится всегда на вершине кучи [6] .

Пример на Python

Стандартная библиотека Python содержит модуль heapq [7] , реализующий очередь с приоритетом [8] :

Источник:

http-wikipediya.ru

Очередь с приоритетом (программирование)

Очередь с приоритетом (программирование)

Очередь с приоритетом (англ.  priority queue ) — абстрактный тип данных в программировании, поддерживающий две обязательные операции — добавить элемент и извлечь максимум [1] (минимум). Предполагается, что для каждого элемента можно вычислить его приоритет — действительное число или в общем случае элемент линейно упорядоченного множества [2] .

Содержание

Основные методы, реализуемые очередью с приоритетом, следующие [2] [3] [1] :

  • insert(ключ, значение) — добавляет пару (ключ, значение) в хранилище;
  • extract_minimum() — возвращает пару (ключ, значение) с минимальным значением ключа, удаляя её из хранилища.

При этом меньшее значение ключа соответствует более высокому приоритету.

В некоторых случаях более естественен рост ключа вместе с приоритетом. Тогда второй метод можно назвать extract_maximum() [1] .

Есть ряд реализаций в которых обе основные операции выполняются в худшем случае за время, ограниченное O ( log ⁡ n ) <\displaystyle O(\log n)> (см. «O» большое и «o» малое), где n <\displaystyle n>  — количество хранимых пар.

В качестве примера очереди с приоритетом можно рассмотреть список задач работника. Когда он заканчивает одну задачу, он переходит к очередной — самой приоритетной (ключ будет величиной, обратной приоритету) — то есть выполняет операцию извлечения максимума. Начальник добавляет задачи в список, указывая их приоритет, то есть выполняет операцию добавления элемента.

Расширения очереди с приоритетом [ | ]

На практике интерфейс очереди с приоритетом нередко расширяют другими операциями [4] [3] :

  • вернуть минимальный элемент без удаления из очереди
  • изменить приоритет произвольного элемента
  • удалить произвольный элемент
  • слить две очереди в одну

В индексированных очередях с приоритетом (адресуемых [5] ) возможно обращение к элементам по индексу. Такие очереди могут быть использованы, например, для слияния нескольких отсортированных последовательностей (multiway merge) [1] .

Реализации [ | ]

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

Простейшие (и не очень эффективные) реализации могут использовать неупорядоченный или упорядоченный массив, связный список, подходящие для небольших очередей. При этом вычисления могут быть как «ленивыми» (тяжесть вычислений переносится на извлечение элемента), так и ранними (eager), когда вставка элемента сложнее его извлечения. То есть, одна из операций может быть произведена за время O ( 1 ) <\displaystyle O(1)> , а другая — за O ( N ) <\displaystyle O(N)> , где N — длина очереди в худшем случае [1] .

Более эффективными являются реализации на основе кучи, где обе операции можно производить в худшем случае за время O ( log ⁡ N ) <\displaystyle O(\log N)> [1] . К ним относятся двоичная куча, биномиальная куча, фибоначчиева куча.

Абстрактный тип данных (АТД) для очереди с приоритетом получается из АТД кучи переименованием соответствующих функций. Минимальное (максимальное) значение находится всегда на вершине кучи [6] .

Пример на Python [ | ]

Стандартная библиотека Python содержит модуль heapq [7] , реализующий очередь с приоритетом [8] :

Источник:

encyclopaedia.bid

Очередь с приоритетом (программирование)

Очередь с приоритетом (программирование)

Очередь с приоритетом (англ.  priority queue ) — абстрактный тип данных в программировании, поддерживающий две обязательные операции — добавить элемент и извлечь максимум [1] . Предполагается, что для каждого элемента можно вычислить его приоритет — действительное число или в общем случае элемент линейно упорядоченного множества [2] .

Содержание

Основные методы, реализуемые очередью с приоритетом, следующие [2] [3] [1] :

  • insert(ключ, значение) — добавляет пару (ключ, значение) в хранилище;
  • extract_minimum() — возвращает пару (ключ, значение) с минимальным значением ключа, удаляя её из хранилища.

При этом меньшее значение ключа соответствует более высокому приоритету.

В некоторых случаях более естественен рост ключа вместе с приоритетом. Тогда второй метод можно назвать extract_maximum() [1] .

Есть ряд реализаций в которых обе основные операции выполняются в худшем случае за время, ограниченное <math>O(\log n)</math> (см. «O» большое и «o» малое), где <math>n</math> — количество хранимых пар.

В качестве примера очереди с приоритетом можно рассмотреть список задач работника. Когда он заканчивает одну задачу, он переходит к очередной — самой приоритетной (ключ будет величиной, обратной приоритету) — то есть выполняет операцию извлечения максимума. Начальник добавляет задачи в список, указывая их приоритет, то есть выполняет операцию добавления элемента.

Расширения очереди с приоритетом

На практике интерфейс очереди с приоритетом нередко расширяют другими операциями [4] [3] :

  • вернуть минимальный элемент без удаления из очереди
  • изменить приоритет произвольного элемента
  • удалить произвольный элемент
  • слить две очереди в одну

В индексированных очередях с приоритетом (адресуемых [5] ) возможно обращение к элементам по индексу. Такие очереди могут быть использованы, например, для слияния нескольких отсортированных последовательностей (multiway merge) [1] .

Реализации

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

Простейшие (и не очень эффективные) реализации могут использовать неупорядоченный или упорядоченный массив, связный список, подходящие для небольших очередей. При этом вычисления могут быть как «ленивыми» (тяжесть вычислений переносится на извлечение элемента), так и ранними (eager), когда вставка элемента сложнее его извлечения. То есть, одна из операций может быть произведена за время <math>O(1)</math>, а другая — за <math>O(N)</math>, где N — длина очереди в худшем случае [1] .

Более эффективными являются реализации на основе кучи, где обе операции можно производить в худшем случае за время <math>O(\log N)</math> [1] . К ним относятся двоичная куча, биномиальная куча, фибоначчиева куча.

Абстрактный тип данных (АТД) для очереди с приоритетом получается из АТД кучи переименованием соответствующих функций. Минимальное (максимальное) значение находится всегда на вершине кучи [6] .

Пример на Python

Стандартная библиотека Python содержит модуль heapq [7] , реализующий очередь с приоритетом [8] :

Этот пример выведет слово «heap».

Напишите отзыв о статье "Очередь с приоритетом (программирование)" Примечания
  1. ^ 123456Sedgewick, Wayne, 2011.
  2. ^ 12Ахо, Хопкрофт, Ульман, 2000.
  3. ^ 12Кормен и др., 2005.
  4. ^Robert Sedgewick. Algorithms in C++, Parts 1–4: Fundamentals, Data Structure, Sorting, Searching. — Third Edition. — Addison-Wesley Professional. — 752 p. — ISBN 978-0-7686-8533-6.
  5. ^Mehlhorn, Sanders, 2008.
  6. ^Rabhi, Lapalme, 1999.
  7. ^ [docs.python.org/2/library/heapq.html 8.4. heapq — Heap queue algorithm]
  8. ^David Beazley, Brian K. Jones. 1.5. Implementing a Priority Queue // Python Cookbook. — 3rd Edition. — O'Reilly Media, Inc., 2013. — 706 p. — ISBN 978-1-4493-4037-7.
Литература
  • Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд.. — М .: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4.
  • Ахо А. В, Хопкрофт Дж. Э., Ульман Дж. Д. Структуры данных и алгоритмы = Data Structures and Algorithms. — Вильямс, 2000. — 384 с. — ISBN 9785845901224. , 4.10. Очереди с приоритетами
  • Robert Sedgewick; Kevin Wayne. 2.4 Priority Queues // Algorithms. — Fourth Edition. — Addison-Wesley Professional, 2011. — 992 с. — ISBN 978-0-13-276257-1.
  • Gerth Stolting Brodal, Chris Okasaki Optimal Purely Functional Priority Queues // BRICS Report Series. — Department of Computer Science University of Aarhus, 1996. — № RS-96-37 . — ISSN [www.sigla.ru/table.jsp?f=8&t=3&v0=0909-0878&f=1003&t=1&v1=&f=4&t=2&v2=&f=21&t=3&v3=&f=1016&t=3&v4=&f=1016&t=3&v5=&bf=4&b=&d=0&ys=&ye=&lng=&ft=&mt=&dt=&vol=&pt=&iss=&ps=&pe=&tr=&tro=&cc=UNION&i=1&v=tagged&s=0&ss=0&st=0&i18n=ru&rlf=&psz=20&bs=20&ce=hJfuypee8JzzufeGmImYYIpZKRJeeOeeWGJIZRrRRrdmtdeee88NJJJJpeeefTJ3peKJJ3UWWPtzzzzzzzzzzzzzzzzzbzzvzzpy5zzjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzztzzzzzzzbzzzzzzzzzzzzzzzzzzzzzzzzzzzvzzzzzzyeyTjkDnyHzTuueKZePz9decyzzLzzzL*.c8.NzrGJJvufeeeeeJheeyzjeeeeJh*peeeeKJJJJJJJJJJmjHvOJJJJJJJJJfeeeieeeeSJJJJJSJJJ3TeIJJJJ3..E.UEAcyhxD.eeeeeuzzzLJJJJ5.e8JJJheeeeeeeeeeeeyeeK3JJJJJJJJ*s7defeeeeeeeeeeeeeeeeeeeeeeeeeSJJJJJJJJZIJJzzz1..6LJJJJJJtJJZ4. EK*&debug=false 0909-0878].
  • Fethi Rabhi and Lapalme, G. Algorithms: A Functional Programming Approach. — Addison-Wesley, 1999. — P. 92-93, 106-107. — 235 p. — ISBN 9780201596045.
  • Mehlhorn, Kurt, Sanders, Peter. 6. Priority Queues // Algorithms and Data Structures: The Basic Toolbox. — Springer, 2008. — 300 с. — ISBN 978-3-540-77978-0.
  • С++STL priority_queue :
  • [msdn.microsoft.com/en-us/library/6w541ec5.aspx страница помощи std::priority_queue на MSDN]
  • [www.sgi.com/tech/stl/priority_queue.html страница помощи std::priority_queue на SGI]
  • Очереди с приоритетом для Ruby:
  • [ruby.brian-amberg.de/priority-queue Brian Amberg’s priority-queue]
  • [raa.ruby-lang.org/project/priorityqueue PriorityQueue в Ruby Application Archive]
  • Верифицированная с помощью Coq реализация очереди с приоритетом для Haskell:
  • [code.google.com/p/priority-queues/ Implementation and verification of priority queues]

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

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

– Соня, тебе хорошо? – изредка спрашивал он.

– Да, – отвечала Соня. – А тебе ?

На середине дороги Николай дал подержать лошадей кучеру, на минутку подбежал к саням Наташи и стал на отвод.

– Наташа, – сказал он ей шопотом по французски, – знаешь, я решился насчет Сони.

– Ты ей сказал? – спросила Наташа, вся вдруг просияв от радости.

– Ах, какая ты странная с этими усами и бровями, Наташа! Ты рада?

– Я так рада, так рада! Я уж сердилась на тебя. Я тебе не говорила, но ты дурно с ней поступал. Это такое сердце, Nicolas. Как я рада! Я бываю гадкая, но мне совестно было быть одной счастливой без Сони, – продолжала Наташа. – Теперь я так рада, ну, беги к ней.

– Нет, постой, ах какая ты смешная! – сказал Николай, всё всматриваясь в нее, и в сестре тоже находя что то новое, необыкновенное и обворожительно нежное, чего он прежде не видал в ней. – Наташа, что то волшебное. А?

– Да, – отвечала она, – ты прекрасно сделал.

«Если б я прежде видел ее такою, какою она теперь, – думал Николай, – я бы давно спросил, что сделать и сделал бы всё, что бы она ни велела, и всё бы было хорошо».

– Так ты рада, и я хорошо сделал?

– Ах, так хорошо! Я недавно с мамашей поссорилась за это. Мама сказала, что она тебя ловит. Как это можно говорить? Я с мама чуть не побранилась. И никому никогда не позволю ничего дурного про нее сказать и подумать, потому что в ней одно хорошее.

– Так хорошо? – сказал Николай, еще раз высматривая выражение лица сестры, чтобы узнать, правда ли это, и, скрыпя сапогами, он соскочил с отвода и побежал к своим саням. Всё тот же счастливый, улыбающийся черкес, с усиками и блестящими глазами, смотревший из под собольего капора, сидел там, и этот черкес был Соня, и эта Соня была наверное его будущая, счастливая и любящая жена.

Приехав домой и рассказав матери о том, как они провели время у Мелюковых, барышни ушли к себе. Раздевшись, но не стирая пробочных усов, они долго сидели, разговаривая о своем счастьи. Они говорили о том, как они будут жить замужем, как их мужья будут дружны и как они будут счастливы.

На Наташином столе стояли еще с вечера приготовленные Дуняшей зеркала. – Только когда всё это будет? Я боюсь, что никогда… Это было бы слишком хорошо! – сказала Наташа вставая и подходя к зеркалам.

– Садись, Наташа, может быть ты увидишь его, – сказала Соня. Наташа зажгла свечи и села. – Какого то с усами вижу, – сказала Наташа, видевшая свое лицо.

– Не надо смеяться, барышня, – сказала Дуняша.

Наташа нашла с помощью Сони и горничной положение зеркалу; лицо ее приняло серьезное выражение, и она замолкла. Долго она сидела, глядя на ряд уходящих свечей в зеркалах, предполагая (соображаясь с слышанными рассказами) то, что она увидит гроб, то, что увидит его, князя Андрея, в этом последнем, сливающемся, смутном квадрате. Но как ни готова она была принять малейшее пятно за образ человека или гроба, она ничего не видала. Она часто стала мигать и отошла от зеркала.

– Отчего другие видят, а я ничего не вижу? – сказала она. – Ну садись ты, Соня; нынче непременно тебе надо, – сказала она. – Только за меня… Мне так страшно нынче!

Соня села за зеркало, устроила положение, и стала смотреть.

– Вот Софья Александровна непременно увидят, – шопотом сказала Дуняша; – а вы всё смеетесь.

Соня слышала эти слова, и слышала, как Наташа шопотом сказала:

– И я знаю, что она увидит; она и прошлого года видела.

Минуты три все молчали. «Непременно!» прошептала Наташа и не докончила… Вдруг Соня отсторонила то зеркало, которое она держала, и закрыла глаза рукой.

– Ах, Наташа! – сказала она.

– Видела? Видела? Что видела? – вскрикнула Наташа, поддерживая зеркало.

Соня ничего не видала, она только что хотела замигать глазами и встать, когда услыхала голос Наташи, сказавшей «непременно»… Ей не хотелось обмануть ни Дуняшу, ни Наташу, и тяжело было сидеть. Она сама не знала, как и вследствие чего у нее вырвался крик, когда она закрыла глаза рукою.

– Его видела? – спросила Наташа, хватая ее за руку.

– Да. Постой… я… видела его, – невольно сказала Соня, еще не зная, кого разумела Наташа под словом его: его – Николая или его – Андрея.

«Но отчего же мне не сказать, что я видела? Ведь видят же другие! И кто же может уличить меня в том, что я видела или не видала?» мелькнуло в голове Сони.

– Да, я его видела, – сказала она.

– Как же? Как же? Стоит или лежит?

– Нет, я видела… То ничего не было, вдруг вижу, что он лежит.

– Андрей лежит? Он болен? – испуганно остановившимися глазами глядя на подругу, спрашивала Наташа.

– Нет, напротив, – напротив, веселое лицо, и он обернулся ко мне, – и в ту минуту как она говорила, ей самой казалось, что она видела то, что говорила.

– Ну а потом, Соня?…

– Тут я не рассмотрела, что то синее и красное…

– Соня! когда он вернется? Когда я увижу его! Боже мой, как я боюсь за него и за себя, и за всё мне страшно… – заговорила Наташа, и не отвечая ни слова на утешения Сони, легла в постель и долго после того, как потушили свечу, с открытыми глазами, неподвижно лежала на постели и смотрела на морозный, лунный свет сквозь замерзшие окна.

Источник:

wiki-org.ru

НОУ ИНТУИТ, Лекция, Очереди с приоритетами и пирамидальная сортировка

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

Во многих приложениях требуется обработка записей в порядке возрастания их ключей, но не обязательно в строгом порядке и не обязательно всех сразу. Часто записи накапливаются в некотором наборе, затем обрабатывается запись с максимальным ключом, после чего, возможно, продолжается накопление записей, потом обрабатывается запись с наибольшим текущим ключом и т.д. Соответствующая структура данных в такой среде поддерживает операции вставки нового элемента и удаления наибольшего элемента. Такая структура данных называется очередью с приоритетами ( priority queue). Использование очередей с приоритетами похоже на использование обычных очередей (удаляется самый старый элемент) и стеков (удаляется самый новый элемент), однако эффективно реализовать их гораздо труднее. Очередь с приоритетами является наиболее важным примером АТД обобщенной очереди, который обсуждался в "Абстрактные типы данных" . Фактически очередь с приоритетами представляет собой обобщение стека и очереди, поскольку эти структуры данных можно реализовать через очереди с приоритетами, используя соответствующие правила назначения приоритетов (см. упражнения 9.3 и 9.4).

Определение 9.1. Очередь с приоритетами — это структура данных, состоящая из элементов с ключами, которая поддерживает две основные операции: вставить (insert) новый элемент и извлечь (remove) элемент с наибольшим ключом.

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

Любую очередь с приоритетами можно использовать в качестве основы алгоритма сортировки, поместив в очередь все записи, а затем последовательно выбирая из нее записи с наибольшим ключом — получится обратно упорядоченная последовательность записей. Далее в этой книге мы увидим, как можно использовать очередь с приоритетами в качестве строительных блоков для более сложных алгоритмов. В части V мы разработаем алгоритм сжатия файлов, основанный на подпрограммах из данной главы, а в "Быстрая сортировка" увидим, как абстракция очередей с приоритетами облегчает понимание взаимоотношений между множеством фундаментальных алгоритмов поиска в графах. Это лишь несколько примеров той важной роли, которую играют очереди с приоритетами как базовые инструментальные средства при разработке алгоритмов.

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

  • Создать очередь с приоритетами из N заданных элементов,
  • Вставить новый элемент,
  • Извлечь наибольший элемент,
  • Изменить приоритет некоторого заданного элемента,
  • Извлечь некоторый заданный элемент,
  • Объединить две очереди с приоритетами в одну.

Если у записей могут быть повторяющиеся ключи, мы считаем, что " наибольший " значит " любая запись с максимальным значением ключа " . Как и в случае других структур данных, в этот набор еще нужно добавить стандартные операции создать, проверить наличие элементов и, возможно, операции уничтожить и копировать.

Эти операции кое в чем перекрываются, а в некоторых случаях удобно определить другие, аналогичные операции . Например, в каких-то клиентских программах может часто возникать необходимость найти наибольший элемент в очереди с приоритетами, но не обязательно удалить его. Или может понадобиться операция заменить наибольший элемент новым элементом. Такие операции можно реализовать, используя в качестве строительных блоков две базовые операции : операцию найти наибольший можно выполнить с помощью операций извлечь наибольший и затем вставить, а операцию заменить наибольший можно выполнить с помощью либо операций вставить и затем извлечь наибольший, либо операций извлечь наибольший и затем вставить. Однако более эффективный программный код получается при непосредственной реализации таких операций — если, конечно, они необходимы и точно определены. Точное определение не всегда однозначно, как это может показаться на первый взгляд. Например, два только что сформулированных варианта операции заменить наибольший существенно отличаются друг от друга: первый из них временно увеличивает размер очереди на один элемент, а второй — временно уменьшает. Подобным же образом операция изменить приоритет может быть реализована через операцию извлечь с последующей операцией вставить, а операция создать может быть реализована с помощью многократного применения операции вставить.

В некоторых ситуациях может оказаться чуть более удобным извлечение не наибольшего элемента, а наименьшего. Мы будем работать главным образом с очередями с приоритетами, которые настроены на доступ к наибольшим ключам. Если будет нужна другая настройка, мы будем называть ее (т.е. очередь с приоритетами, позволяющая извлечь наименьший элемент) очередью с приоритетами, ориентированной на минимальный элемент (minimum-oriented).

Очередь с приоритетами является прототипом абстрактного типа данных (АТД, см. "Абстрактные типы данных" ): это четко определенный набор операций над данными, который является удобной абстракцией, позволяющей отделить прикладные программы (клиенты) от различных реализаций, которые будут рассмотрены в настоящей главе. Интерфейс , заданный программой 9.1, определяет самые основные операции над очередями с приоритетами; более полный интерфейс будет рассмотрен в разделе 9.5. Строго говоря, различные подмножества разных операций, которые мы предпочтем включить в свой рабочий набор, приводят к различным абстрактным структурам данных, но для очередей с приоритетами наиболее характерны операции извлечь наибольший и вставить, поэтому основное внимание будет уделено именно им.

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

Сначала это положение будет проиллюстрировано в разделе 9.1 при обсуждении нескольких элементарных структур данных для реализации очередей с приоритетами. Далее, в разделах 9.2—9.4, наше внимание будет сосредоточено на рассмотрении классической структуры данных, получившей название пирамидальное дерево , которая обеспечивает эффективную реализацию всех операций, кроме операции объединить. Кроме того, в разделе 9.4 будет рассмотрен важный алгоритм сортировки, естественным образом вытекающий из этих реализаций.

Программа 9.1. Базовый АТД очереди с приоритетами

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

В разделах 9.5 и 9.6 будут более подробно проанализированы некоторые проблемы, связанные с разработкой полных АТД очереди с приоритетами. И в завершение, в разделе 9.7 мы рассмотрим более сложную структуру данных, получившую название биномиальной очереди, которая позволяет реализовать все операции (в том числе и операции объединить) с логарифмическим временем выполнения в худшем случае.

При изучении всех этих структур данных мы будем рассматривать как основные компромиссы — между связным и последовательным распределением памяти (см. "Элементарные структуры данных" ) — так и задачи оформления пакетов, пригодных для использования прикладными программами. В частности, некоторые из продвинутых алгоритмов, описанных далее в этой книге, представляют собой клиентские программы, использующие очереди с приоритетами.

9.1. В последовательности

р r I о * R * * I * T * Y * * * Q U E * * * U * E

буква означает операцию вставить, а звездочка — операцию извлечь наибольший. Приведите последовательность значений, возвращаемых операциями извлечь наибольший.

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

( ( ( P R I O ) + ( R * I T * Y * ) ) * * * ) + ( Q U E * * * U * E )

9.3. Объясните, как использовать АТД очереди с приоритетами для реализации АТД стека.

9.4. Объясните, как использовать АТД очереди с приоритетами для реализации АТД очереди.

Вопросы и ответы

Привет! подскажите как пользоваться курсами?

зарегистрировался на курсах "Алгоритмы на С++", прочел первую лекцию, решил вопросы вконце лекции, а что дальше? будут ли тестирование или иной контроль? есть ли какие-нибудь временные рамки по лекциям? когда екзамен?

начинать учить лекцию 2? а лекцию 5? так можно просто скачать ел. книгу и читать ее без регистрации на сайте? Спасибо!

Источник:

www.intuit.ru

Очереди с приоритетами в городе Екатеринбург

В данном интернет каталоге вы всегда сможете найти Очереди с приоритетами по разумной цене, сравнить цены, а также изучить прочие предложения в группе товаров Книги. Ознакомиться с параметрами, ценами и рецензиями товара. Доставка выполняется в любой населённый пункт РФ, например: Екатеринбург, Пермь, Магнитогорск.