priority queue data structure c with illustration
Úvod do prioritní fronty v C ++ s ilustrací.
Prioritní fronta je rozšíření fronty, o které jsme diskutovali v našem posledním kurzu.
Je to v určitých aspektech podobné frontě, a přesto se od běžné fronty liší v následujících bodech:
- Každá položka ve frontě priorit je spojena s prioritou.
- Položka s nejvyšší prioritou je první položkou, která má být odebrána z fronty.
- Pokud má více než jedna položka stejnou prioritu, je bráno v úvahu jejich pořadí ve frontě.
=> Klikněte sem a získejte Absolute C ++ Training Series.
Můžeme si představit prioritní frontu jako upravenou verzi fronty kromě toho, že když má být položka odebrána z fronty, je nejprve načtena položka s nejvyšší prioritou. Když tedy potřebujeme zpracovávat položky na základě priority, raději použijeme prioritní fronty místo front.
Co se naučíte:
Základní operace
Pojďme diskutovat o některých základních operacích podporovaných prioritní frontou.
- Vložit (položka, priorita): Vloží položku do fronty priorit s danou prioritou.
- getHighestPriority (): Vrátí položku s nejvyšší prioritou.
- deleteHighestPriority (): Odebere položku s nejvyšší prioritou.
Kromě výše uvedených operací můžeme také použít normální operace fronty jako isEmpty (), isFull () a peek ().
Ilustrace
Uvidíme ilustraci prioritní fronty. Pro zjednodušení použijeme jako položky ve frontě priorit znaky ASCII. Čím vyšší je hodnota ASCII, tím vyšší je priorita.
Počáteční stav - prioritní fronta (PQ) - {} => prázdný
Z výše uvedeného obrázku vidíme, že operace vložení je podobná běžné frontě. Ale když pro prioritní frontu nazýváme „deleteHighestPriority“, nejprve se odstraní prvek s nejvyšší prioritou.
Proto při prvním volání této funkce je položka O odstraněna, zatímco podruhé je položka M odstraněna, protože má vyšší prioritu než G a A.
Implementace prioritních front v C ++
Prioritní fronty lze implementovat pomocí:
# 1) Pole / Propojené seznamy
Můžeme implementovat prioritní fronty pomocí polí a toto je nejjednodušší implementace pro prioritní fronty.
Abychom reprezentovali položky ve frontě priorit, můžeme deklarovat strukturu, jak je uvedeno níže:
struct pq_item{ int item; int priority; };
Pro každou položku jsme také deklarovali prioritu.
Chcete-li vložit novou položku do fronty priorit, musíme ji jednoduše vložit na konec pole.
Chcete-li získat prvek z fronty pomocí getHighestPriority (), musíme od začátku projít pole a vrátit položku s nejvyšší prioritou.
Podobně k odebrání položky z fronty pomocí operace deleteHighestPriority musíme projít celé pole a odstranit položku s nejvyšší prioritou. Poté přesuňte všechny ostatní prvky za odstraněnou položku o jednu pozici zpět.
Můžeme také implementovat prioritní frontu pomocí propojeného seznamu. Můžeme provádět všechny operace podobným způsobem jako pole. Jediný rozdíl je v tom, že po volání deleteHighestPriority nemusíme přesouvat prvky.
# 2) Hromady
Nejúčinnějším způsobem je použití hromad k implementaci prioritní fronty a poskytuje mnohem lepší výkon ve srovnání s propojenými seznamy a poli. Na rozdíl od propojeného seznamu a pole, implementace haldy zabere O (logn) čas pro operace vložení a odstranění prioritní fronty. Získejte operaci, getHighestPriority zabere O (1) čas.
# 3) Integrovaná prioritní fronta ve standardní knihovně šablon (STL) v C ++
V C ++ máme prioritní frontu jako kontejnerovou adaptivní třídu navrženou tak, že nejvyšší prvek je první prvek ve frontě a všechny prvky jsou v sestupném pořadí.
Každá položka ve frontě priorit má tedy pevnou prioritu.
Máme třídu v STL, která obsahuje implementaci prioritní fronty.
Různé operace podporované prioritní frontou jsou následující:
- priority_queue :: size (): Vrátí velikost fronty.
- priority_queue :: empty (): Zkontroluje, zda je fronta prázdná, a vrátí její stav.
- priority_queue :: top (): Vrátí odkaz na nejvyšší prvek prioritní fronty.
- priority_queue :: push (): Přidá položku na konec prioritní fronty.
- priority_queue :: pop (): Odebere první prvek z prioritní fronty.
- priority_queue :: swap (): Slouží k výměně obsahu jedné prioritní fronty za jinou se stejným typem a velikostí.
- typ hodnoty prioritní fronty: Typ hodnoty udává typ prvku uloženého uvnitř prioritní fronty. To také funguje jako synonymum pro parametr šablony.
- priority_queue :: emplace (): Slouží k vložení nového prvku do kontejneru prioritní fronty v horní části fronty.
V dalším programu uvidíme funkčnost prioritní fronty v STL v C ++.
#include #include using namespace std; void displaypq(priority_queue pq) { priority_queue pqueue = pq; while (!pqueue.empty()) { cout << ' ' << pqueue.top(); pqueue.pop(); } cout << '
'; } int main () { priority_queue pq; pq.push(1); pq.push(3); pq.push(5); pq.push(7); pq.push(9); cout << 'Size of the queue(pq.size()): ' << pq.size(); cout << '
Top element of the queue(pq.top()): ' << pq.top(); cout << '
The priority queue pq is : '; displaypq(pq); cout << '
Priority queue, after pq.pop() operation : '; pq.pop(); displaypq(pq); return 0; }
Výstup:
jak nastavit selenovou mřížku
Velikost fronty (pq.size ()): 5
Horní prvek fronty (pq.top ()): 9
Prioritní fronta pq je: 9 7 5 3 1
Prioritní fronta po operaci pq.pop (): 7 5 3 1
Implementace Java pro prioritní frontu
Prioritní fronta v Javě je speciální fronta, kde jsou všechny prvky ve frontě seřazeny podle přirozeného řazení nebo vlastního řazení pomocí komparátoru dodávaného s frontou.
Fronta priorit v prostředí Java vypadá takto:
V prioritní frontě Java jsou prvky uspořádány tak, že nejmenší prvek je v přední části fronty a největší prvek je v zadní části fronty. Když tedy odstraníme prvek z prioritní fronty, vždy se odebere nejmenší prvek.
Třída, která implementuje prioritní frontu v Javě, je „PriorityQueue“ a je součástí rámce sbírek v Javě. Implementuje rozhraní „Queue“ prostředí Java.
Následuje hierarchie tříd pro třídu Java PriorityQueue.
Níže je uveden příklad funkce prioritní fronty s celými čísly jako položkami v Javě.
import java.util.*; class Main { public static void main(String args()) { // Create empty priority queue PriorityQueue priority_Queue = new PriorityQueue(); // Adding items to the priority_Queue using add() priority_Queue.add(1); priority_Queue.add(3); priority_Queue.add(5); priority_Queue.add(7); // display the most priority element System.out.println('peek()::Head value:' + priority_Queue.peek()); // Print all elements in Priotity queue System.out.println('The priority queue:'); Iterator itr = priority_Queue.iterator(); while (itr.hasNext()) System.out.print(itr.next() + ' '); // poll() function to remove the queue elements priority_Queue.poll(); System.out.println('
After poll() function, priority queue:'); Iterator itr2 = priority_Queue.iterator(); while (itr2.hasNext()) System.out.print(itr2.next() + ' '); // remove() function with priority queue priority_Queue.remove(5); System.out.println('
After Remove(5) function, priority queue:'); Iterator itr3 = priority_Queue.iterator(); while (itr3.hasNext()) System.out.print(itr3.next() + ' '); // Check if an element is present using contains() boolean b = priority_Queue.contains(3); System.out.println ( '
Priority queue contains 3?: ' + b); // use toArray() function to get objects from the queue and display the array elements Object() arr = priority_Queue.toArray(); System.out.println ( 'Array elements: '); for (int i = 0; i Výstup:
peek () :: Hlavní hodnota: 1
Fronta priorit:
1 3 5 7
Po funkci poll (), prioritní fronta:
3 7 5
Po funkci Odebrat (5) prioritní fronta:
3 7
Prioritní fronta obsahuje 3 ?: true
Pole prvky:
Hodnota: 3
Hodnota: 7
Ve výše uvedeném programu používáme třídu PriorityQueue v Javě k vytvoření objektu PriorityQueue, který obsahuje objekt Integer. Přidáváme prvky do fronty pomocí funkce „přidat“. Potom je volána funkce poll () a odstraní prvek z přední části fronty, který je shodou okolností nejmenším prvkem.
Opět voláme funkci „remove ()“, která odstraní prvek zadaný jako parametr z fronty. Pomocí funkce „Obsahuje ()“ také kontrolujeme, zda je ve frontě přítomen určitý prvek. Nakonec převedeme frontu na objekt pole pomocí funkce „toArray ()“.
aplikace
- Vyrovnávání zatížení operačního systému a obslužné rutiny přerušení: Funkce operačního systému, jako je vyvažování zátěže a zpracování přerušení, jsou implementovány pomocí prioritních front. Aktivita vyrovnávání zatížení naplánuje zdroje s nejvyšší prioritou, aby bylo možné efektivně provádět naše vyrovnávání zatížení. Zpracování přerušení se provádí obsluhou přerušení s nejvyšší prioritou. Tuto funkčnost lze efektivně implementovat pomocí prioritních front.
- Směrování: Směrování je funkce, která se používá k směrování síťových prostředků tak, abychom získali maximální propustnost s minimální dobou zpracování. To lze také implementovat pomocí prioritní fronty.
- Nouzová nemocnice: Na nemocniční pohotovosti jsou pacienti ošetřováni podle závažnosti stavu pacienta. To lze simulovat pomocí prioritních front.
- Algoritmus nejkratší cesty Dijkstra: Zde je graf uložen jako seznam adjacency a můžeme použít prioritní frontu k efektivnímu extrakci minimální vážené hrany ze seznamu adjacency k implementaci Dijkstraova nejkratšího algoritmu cesty.
- Prioritní frontu lze také použít k uložení klíčů uzlů a extrahování minimálního uzlu klíče při implementaci rozloženého stromu.
Závěr
Prioritní fronty nejsou nic jiného než rozšíření fronty. Ale na rozdíl od front, které přidávají / odebírají položky pomocí přístupu FIFO, jsou v prioritní frontě položky odstraněny z fronty podle priority. Každá položka ve frontě je tedy spojena s prioritou a položka s nejvyšší prioritou je první, která byla odebrána z fronty.
Fronta priorit má tři hlavní operace, tj. Insert (), getHighestPriority () a deleteHighestPriority (). Prioritní frontu lze implementovat pomocí polí nebo propojeného seznamu, ale práce není příliš efektivní. Prioritní frontu lze také implementovat pomocí hromad a výkon je mnohem rychlejší.
V C ++ máme také kontejnerovou třídu, která implementuje funkčnost prioritní fronty. V Javě je předdefinovaná třída priority_queue, která poskytuje funkce prioritní fronty.
Fronta priorit se používá hlavně v aplikacích, které vyžadují zpracování položek podle priority. Například, používá se při zpracování přerušení.
Náš nadcházející výukový program prozkoumá vše o kruhové frontě, která je dalším rozšířením fronty.
=> Navštivte zde kompletní kurz C ++ od odborníků.
Doporučené čtení
- Struktura dat fronty v C ++ s ilustrací
- Prioritní fronta v STL
- Skládejte datovou strukturu v C ++ s ilustrací
- Datová struktura kruhového propojeného seznamu v C ++ s ilustrací
- Propojená datová struktura seznamu v C ++ s ilustrací
- Dvojnásobně propojená datová struktura seznamu v C ++ s ilustrací
- Úvod do datových struktur v C ++
- Jak otestovat frontu zasílání zpráv aplikací: Výukový program pro úvod do produktu IBM WebSphere MQ