Черга з пріоритетами (англ. priority queue) — це структура даних, що призначена для обслуговування множини елементів, кожний з яких додатково має "пріоритет", пов'язаний з ним. У пріоритетній черзі першим обслуговується елемент, який має найвищий пріоритет, відповідно елемент, що має найнижчий пріоритет буде обслугований останнім. У деяких реалізаціях, якщо два елементи мають однаковий пріоритет, вони подаються відповідно до порядку, в якому вони були закладені, в той час як в інших реалізаціях упорядкування елементів з однаковим пріоритетом не визначено.
Хоча черги з пріоритетами часто реалізуються купами, вони концептуально відрізняються від них. Черга пріоритетів - це абстрактне поняття, як "список" або "карта"; так само, як список може бути реалізована зв'язаним списком або масивом, черга з пріоритетом може бути реалізована купою або безліччю інших методів, таких як невпорядкований масив.
Операції
Черга з пріоритетами повинна підтримувати принаймні такі операції:
- is_empty: перевіряє, чи черга порожня.
- insert_with_priority: додає елемент до черги з відповідним йому пріоритетом.
- pull_highest_priority_element: вилучає з черги елемент, що має найвищий пріоритет, повертаючи його.
Інші назви: "pop_element (Off)", "get_maximum_element" або "get_front (most) _element".
Деякі конвенції змінюють порядок пріоритетів, вважаючи, що менші значення мають вищий пріоритет, тому це може бути відоме як "get_minimum_element", і часто в літературі називається "get-min".
Також цю операцію можна замінити двома окремими функціями: "peek_at_highest_priority_element" і "delete_element", які можуть бути об'єднані для створення "pull_highest_priority_element".
Крім того, peek (у цьому контексті часто називається find-max або find-min), що повертає елемент з найвищим пріоритетом, але не змінює чергу, часто реалізується, і майже завжди виконується за час . Ця операція та її продуктивність мають вирішальне значення для багатьох застосувань пріоритетних черг.
Сучасніші реалізації можуть підтримувати складніші операції, такі як pull_lowest_priority_element, що перевіряє перші кілька елементів з найвищим або найнижчим пріоритетом, очищаючи чергу, очищаючи підмножини черги, виконуючи пакетну вставку, об'єднуючи дві або більше черг в одну, збільшуючи пріоритет будь-якого елемента тощо.
Використання черги з пріоритетом для сортування
З точки зору обчислювальної складності, пріоритетні черги узгоджуються з алгоритмами сортування. Семантика пріоритетних черг, пропонує метод сортування: вставляти всі елементи, які слід сортувати, в чергу пріоритетів, і послідовно видаляти їх, таким чином вони виходитимуть у відсортованому порядку. Насправді це процедура, яка використовується кількома алгоритмами сортування, після видалення рівня абстракції, що надається чергою пріоритету. Цей метод сортування еквівалентний таким алгоритмам сортування:
Назва | Реалізація пріоритетної черги | Найкраща швидкодія | Середня швидкодія | Найгірша швидкодія |
---|---|---|---|---|
Пірамідальне сортування | Купа | |||
Плавне сортування | Купа Леонардо | |||
Сортування вибором | Невпорядкований масив | |||
Сортування включенням | Впорядкований масив | |||
Сортування двійковим деревом | Збалансоване двійкове дерево пошуку |
Реалізація
Прості реалізації
Існує багато простих способів реалізації черги з пріоритетами, проте, як правило, вони не є ефективними. Такі способи допомагають краще зрозуміти, що таке пріоритетна черга. Наприклад, можна зберегти всі елементи в невпорядкованому списку. У цьому випадку кожного разу, щоб отримати елемент з найвищим пріоритетом, потрібно буде виконувати пошук по всіх елементах списку. (У великій O-нотації: час вставки, час витягування за рахунок пошуку.)
Звичайна реалізація
Щоб підвищити продуктивність, черги з пріоритетами зазвичай використовують купу як свою магістраль, даючи продуктивність для вставок і вилучень, і для початкової побудови. Різновиди базових куп, такі як купа сполучень або купа Фібоначчі, можуть надати кращі асимптотичні розміри для деяких операцій.
Альтернативно, коли використовується самозбалансоване двійкове дерево пошуку, вставка і видалення також займають час , хоча побудова дерев з існуючих послідовностей елементів займає час , що характерно, при наявності доступу до цих структур даних, наприклад, із сторонніх або стандартних бібліотек.
Спеціалізовані купи
Існує декілька спеціалізованих структур даних – куп, які або забезпечують додаткові операції, або покращують реалізації на основі куп для конкретних типів ключів, зокрема цілочислових ключів.
- Коли набір ключів дорівнює {1, 2, ..., C}, і потрібні лише insert, find-min та extract-min , чергу відра можна сконструювати як масив зв'язаних списків C, з вказівником на верхню частину (спочатку C). Вставка елемента з ключем k додає елемент до k-комірки, і оновлює top ← min (top, k), обидві операції виконуються за сталий час. Extract-min видаляє та повертає один елемент зі списку з вершиною індексу, після чого збільшує вершину, якщо це необхідно, доки він знову не буде вказувати на непустий список. Це займає час у найгіршому випадку. Такі черги корисні для сортування вершин графу за їхнім степенем.
- Для набору ключів {1, 2, ..., C} дерево ван Емде Боаса підтримуватиме minimum, maximum, insert, delete, search, extract-min, extract-max, predecessor і successor операції в час, але має простір для малих черг близько O(2m/2) , де m - кількість бітів у значенні пріоритету.
- Алгоритм дерева злиття Фредмана і Вілларда реалізує мінімальну операцію за час і операції insert і extract-min в час, однак автор стверджує, що: "Наші алгоритми мають лише теоретичний інтерес. Постійні фактори, що беруть участь у часі виконання, виключають практичність".
Для додатків, які виконують багато операцій "peek" для кожної операції "extract-min" складність часу для peek може бути зменшена до у всіх реалізаціях дерев і куп, кешуванням елементу найвищого пріоритету після кожної вставки і видалення. Для вставки це додає не більше постійної вартості, оскільки знову вставлений елемент порівнюється тільки з раніше кешованим мінімальним елементом. Для видалення це максимум спричинює додаткові витрати, які зазвичай дешевші, ніж вартість видалення, тому на загальну складність часу суттєво не впливає.
Монотонні пріоритетні черги - це спеціалізовані черги, які оптимізовані для випадку, коли не вставляється жоден елемент, що має нижчий пріоритет (у випадку min-heap), ніж будь-який попередньо витягнутий елемент. Це обмеження задовольняється кількома практичними застосуваннями пріоритетних черг.
Приклад реалізації
Приклад реалізації пріоритетної черги на за допомогою двозв'язного списку:
#include <iostream> #include <list> using namespace std; struct Pair { char value; size_t priority; Pair(char v, size_t p): value(v), priority(p) {} }; class PriorityQueue { list<Pair> queue; public: void enqueue(Pair elem) { for (auto it = queue.begin(); it != queue.end(); ++it) { if (it->priority > elem.priority) { queue.insert(it, elem); return; } } queue.push_back(elem); } char dequeue() { char result = queue.front().value; queue.erase(queue.begin()); return result; } size_t size() { return queue.size(); } char top() { return queue.front().value; } bool isEmpty() { return queue.size() == 0; } };
Див. також
Література
- Томас Кормен; Чарльз Лейзерсон, Рональд Рівест, Кліфорд Стайн (2009) [1990]. Section 6.5: Черги з пріоритетами. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
Це незавершена стаття про інформаційні технології. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cherga z prioritetami angl priority queue ce struktura danih sho priznachena dlya obslugovuvannya mnozhini elementiv kozhnij z yakih dodatkovo maye prioritet pov yazanij z nim U prioritetnij cherzi pershim obslugovuyetsya element yakij maye najvishij prioritet vidpovidno element sho maye najnizhchij prioritet bude obslugovanij ostannim U deyakih realizaciyah yaksho dva elementi mayut odnakovij prioritet voni podayutsya vidpovidno do poryadku v yakomu voni buli zakladeni v toj chas yak v inshih realizaciyah uporyadkuvannya elementiv z odnakovim prioritetom ne viznacheno Hocha chergi z prioritetami chasto realizuyutsya kupami voni konceptualno vidriznyayutsya vid nih Cherga prioritetiv ce abstraktne ponyattya yak spisok abo karta tak samo yak spisok mozhe buti realizovana zv yazanim spiskom abo masivom cherga z prioritetom mozhe buti realizovana kupoyu abo bezlichchyu inshih metodiv takih yak nevporyadkovanij masiv OperaciyiCherga z prioritetami povinna pidtrimuvati prinajmni taki operaciyi is empty pereviryaye chi cherga porozhnya insert with priority dodaye element do chergi z vidpovidnim jomu prioritetom pull highest priority element viluchaye z chergi element sho maye najvishij prioritet povertayuchi jogo Inshi nazvi pop element Off get maximum element abo get front most element Deyaki konvenciyi zminyuyut poryadok prioritetiv vvazhayuchi sho menshi znachennya mayut vishij prioritet tomu ce mozhe buti vidome yak get minimum element i chasto v literaturi nazivayetsya get min Takozh cyu operaciyu mozhna zaminiti dvoma okremimi funkciyami peek at highest priority element i delete element yaki mozhut buti ob yednani dlya stvorennya pull highest priority element Krim togo peek u comu konteksti chasto nazivayetsya find max abo find min sho povertaye element z najvishim prioritetom ale ne zminyuye chergu chasto realizuyetsya i majzhe zavzhdi vikonuyetsya za chas O 1 displaystyle O 1 Cya operaciya ta yiyi produktivnist O 1 displaystyle O 1 mayut virishalne znachennya dlya bagatoh zastosuvan prioritetnih cherg Suchasnishi realizaciyi mozhut pidtrimuvati skladnishi operaciyi taki yak pull lowest priority element sho pereviryaye pershi kilka elementiv z najvishim abo najnizhchim prioritetom ochishayuchi chergu ochishayuchi pidmnozhini chergi vikonuyuchi paketnu vstavku ob yednuyuchi dvi abo bilshe cherg v odnu zbilshuyuchi prioritet bud yakogo elementa tosho Vikoristannya chergi z prioritetom dlya sortuvannyaZ tochki zoru obchislyuvalnoyi skladnosti prioritetni chergi uzgodzhuyutsya z algoritmami sortuvannya Semantika prioritetnih cherg proponuye metod sortuvannya vstavlyati vsi elementi yaki slid sortuvati v chergu prioritetiv i poslidovno vidalyati yih takim chinom voni vihoditimut u vidsortovanomu poryadku Naspravdi ce procedura yaka vikoristovuyetsya kilkoma algoritmami sortuvannya pislya vidalennya rivnya abstrakciyi sho nadayetsya chergoyu prioritetu Cej metod sortuvannya ekvivalentnij takim algoritmam sortuvannya Nazva Realizaciya prioritetnoyi chergi Najkrasha shvidkodiya Serednya shvidkodiya Najgirsha shvidkodiya Piramidalne sortuvannya Kupa n log n displaystyle n log n n log n displaystyle n log n n log n displaystyle n log n Plavne sortuvannya Kupa Leonardo n displaystyle n n log n displaystyle n log n n log n displaystyle n log n Sortuvannya viborom Nevporyadkovanij masiv n 2 displaystyle n 2 n 2 displaystyle n 2 n 2 displaystyle n 2 Sortuvannya vklyuchennyam Vporyadkovanij masiv n displaystyle n n 2 displaystyle n 2 n 2 displaystyle n 2 Sortuvannya dvijkovim derevom Zbalansovane dvijkove derevo poshuku n log n displaystyle n log n n log n displaystyle n log n n log n displaystyle n log n RealizaciyaProsti realizaciyi Isnuye bagato prostih sposobiv realizaciyi chergi z prioritetami prote yak pravilo voni ne ye efektivnimi Taki sposobi dopomagayut krashe zrozumiti sho take prioritetna cherga Napriklad mozhna zberegti vsi elementi v nevporyadkovanomu spisku U comu vipadku kozhnogo razu shob otrimati element z najvishim prioritetom potribno bude vikonuvati poshuk po vsih elementah spisku U velikij O notaciyi O 1 displaystyle O 1 chas vstavki O n displaystyle O n chas vityaguvannya za rahunok poshuku Zvichajna realizaciya Shob pidvishiti produktivnist chergi z prioritetami zazvichaj vikoristovuyut kupu yak svoyu magistral dayuchi O log n displaystyle O log n produktivnist dlya vstavok i viluchen i O n displaystyle O n dlya pochatkovoyi pobudovi Riznovidi bazovih kup taki yak kupa spoluchen abo kupa Fibonachchi mozhut nadati krashi asimptotichni rozmiri dlya deyakih operacij Alternativno koli vikoristovuyetsya samozbalansovane dvijkove derevo poshuku vstavka i vidalennya takozh zajmayut chas O log n displaystyle O log n hocha pobudova derev z isnuyuchih poslidovnostej elementiv zajmaye chas O n log n displaystyle O n log n sho harakterno pri nayavnosti dostupu do cih struktur danih napriklad iz storonnih abo standartnih bibliotek Specializovani kupi Isnuye dekilka specializovanih struktur danih kup yaki abo zabezpechuyut dodatkovi operaciyi abo pokrashuyut realizaciyi na osnovi kup dlya konkretnih tipiv klyuchiv zokrema cilochislovih klyuchiv Koli nabir klyuchiv dorivnyuye 1 2 C i potribni lishe insert find min ta extract min chergu vidra mozhna skonstruyuvati yak masiv zv yazanih spiskiv C z vkazivnikom na verhnyu chastinu spochatku C Vstavka elementa z klyuchem k dodaye element do k komirki i onovlyuye top min top k obidvi operaciyi vikonuyutsya za stalij chas Extract min vidalyaye ta povertaye odin element zi spisku z vershinoyu indeksu pislya chogo zbilshuye vershinu yaksho ce neobhidno doki vin znovu ne bude vkazuvati na nepustij spisok Ce zajmaye chas O C displaystyle O C u najgirshomu vipadku Taki chergi korisni dlya sortuvannya vershin grafu za yihnim stepenem Dlya naboru klyuchiv 1 2 C derevo van Emde Boasa pidtrimuvatime minimum maximum insert delete search extract min extract max predecessor i successor operaciyi v O log log C displaystyle O log log C chas ale maye prostir dlya malih cherg blizko O 2m 2 de m kilkist bitiv u znachenni prioritetu Algoritm dereva zlittya Fredmana i Villarda realizuye minimalnu operaciyu za chas O 1 displaystyle O 1 i operaciyi insert i extract min v O log n displaystyle O sqrt log n chas odnak avtor stverdzhuye sho Nashi algoritmi mayut lishe teoretichnij interes Postijni faktori sho berut uchast u chasi vikonannya viklyuchayut praktichnist Dlya dodatkiv yaki vikonuyut bagato operacij peek dlya kozhnoyi operaciyi extract min skladnist chasu dlya peek mozhe buti zmenshena do O 1 displaystyle O 1 u vsih realizaciyah derev i kup keshuvannyam elementu najvishogo prioritetu pislya kozhnoyi vstavki i vidalennya Dlya vstavki ce dodaye ne bilshe postijnoyi vartosti oskilki znovu vstavlenij element porivnyuyetsya tilki z ranishe keshovanim minimalnim elementom Dlya vidalennya ce maksimum sprichinyuye dodatkovi vitrati yaki zazvichaj deshevshi nizh vartist vidalennya tomu na zagalnu skladnist chasu suttyevo ne vplivaye Monotonni prioritetni chergi ce specializovani chergi yaki optimizovani dlya vipadku koli ne vstavlyayetsya zhoden element sho maye nizhchij prioritet u vipadku min heap nizh bud yakij poperedno vityagnutij element Ce obmezhennya zadovolnyayetsya kilkoma praktichnimi zastosuvannyami prioritetnih cherg Priklad realizaciyi Priklad realizaciyi prioritetnoyi chergi na C za dopomogoyu dvozv yaznogo spisku include lt iostream gt include lt list gt using namespace std struct Pair char value size t priority Pair char v size t p value v priority p class PriorityQueue list lt Pair gt queue public void enqueue Pair elem for auto it queue begin it queue end it if it gt priority gt elem priority queue insert it elem return queue push back elem char dequeue char result queue front value queue erase queue begin return result size t size return queue size char top return queue front value bool isEmpty return queue size 0 Div takozhCherga struktura danih Stek Spisok abstraktnij tip danih Masiv struktura danih Kupa struktura danih Algoritmi sortuvannya Asociativnij masivLiteraturaTomas Kormen Charlz Lejzerson Ronald Rivest Kliford Stajn 2009 1990 Section 6 5 Chergi z prioritetami Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4 Ce nezavershena stattya pro informacijni tehnologiyi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi