priority queue data structure c with illustration
Uvod u prioritetni red u C ++ s ilustracijom.
Prioritetni red je proširenje reda o kojem smo razgovarali u našem zadnjem vodiču.
Sličan je redu u određenim aspektima, a ipak se razlikuje od uobičajenog reda u sljedećim točkama:
- Svaka je stavka u redu prioriteta povezana s prioritetom.
- Stavka s najvećim prioritetom prva je stavka koja se uklanja iz reda čekanja.
- Ako više stavki ima isti prioritet, tada se uzima u obzir njihov redoslijed u redu.
=> Kliknite ovdje za apsolutnu seriju C ++ treninga.
Prioritetni red možemo vizualizirati kao izmijenjenu verziju reda, osim da se stavka s najvišim prioritetom prvo preuzima kad se stavka treba ukloniti iz reda čekanja. Stoga radije koristimo prioritetne redove umjesto redova kada moramo obraditi stavke na temelju prioriteta.
Što ćete naučiti:
- Osnovne operacije
- Ilustracija
- Implementacija prioritetnih redova u C ++
- Primjena
- Zaključak
- Preporučena literatura
Osnovne operacije
Razmotrimo neke od osnovnih operacija podržanih redom prioriteta.
- Umetni (stavka, prioritet): Umeta stavku u red prioriteta s danim prioritetom.
- getHighestPriority (): Vraća stavku s najvišim prioritetom.
- deleteHighestPriority (): Uklanja stavku s najvišim prioritetom.
Osim gore navedenih operacija, možemo koristiti i uobičajene operacije u redu, poput isEmpty (), isFull () i peek ().
Ilustracija
Pogledajmo ilustraciju reda prioriteta. Radi jednostavnosti koristit ćemo ASCII znakove kao stavke u redu prioriteta. Što je veća vrijednost ASCII, to je veći prioritet.
Početno stanje - Prioritetni red (PQ) - {} => prazan
Iz gornje ilustracije vidimo da je operacija umetanja slična uobičajenom redu čekanja. Ali kada za red prioriteta pozovemo 'deleteHighestPriority', element s najvišim prioritetom prvo se uklanja.
Stoga se prvi put kada pozivamo ovu funkciju uklanja O, dok se drugi put uklanja M, jer ima veći prioritet od G i A.
Implementacija prioritetnih redova u C ++
Prioritetni redovi mogu se implementirati pomoću:
# 1) Nizovi / povezani popisi
Prioritetne redove možemo implementirati pomoću nizova i ovo je najjednostavnija implementacija za prioritetne redove.
Da bismo predstavili stavke u redu prioriteta, možemo samo proglasiti strukturu kao što je prikazano u nastavku:
struct pq_item{ int item; int priority; };
Proglasili smo i prioritet za svaku stavku.
Da bismo umetnuli novu stavku u prioritetni red, jednostavno je moramo umetnuti na kraj polja.
Da bismo element dobili iz reda koristeći getHighestPriority (), moramo preći niz od početka i vratiti stavku s najvišim prioritetom.
Slično tome, da bismo uklonili stavku iz reda pomoću operacije deleteHighestPriority, moramo preći cijeli niz i izbrisati stavku s najvišim prioritetom. Zatim premjestite sve ostale elemente nakon izbrisane stavke, jedan položaj unatrag.
Također možemo implementirati prioritetni red pomoću povezanog popisa. Sve operacije možemo izvoditi na sličan način poput nizova. Jedina je razlika u tome što ne moramo premještati elemente nakon pozivanja deleteHighestPriority.
# 2) Hrpe
Korištenje hrpa za implementaciju reda prioriteta je najučinkovitiji način i pruža puno bolje performanse u usporedbi s povezanim popisima i nizovima. Suprotno povezanom popisu i nizu, implementaciji hrpe treba O (logn) vrijeme za operacije umetanja i brisanja reda prioriteta. Nabavite operaciju, getHighestPriority traje O (1) vrijeme.
# 3) Ugrađeni prioritetni red u knjižnici standardnih predložaka (STL) u C ++
U C ++-u imamo prioritetni red kao prilagodljivu klasu spremnika, dizajniran na takav način da je najviši element prvi element u redu i svi se elementi smanjuju.
Stoga svaka stavka u redu prioriteta ima fiksni prioritet.
Imamo klasu u STL-u, koja sadrži implementaciju reda prioriteta.
Razne operacije podržane redom prioriteta su kako slijedi:
- prioritet_reda :: veličina (): Vraća veličinu reda.
- prioritet_reda :: prazno (): Provjerava je li red prazan i vraća li svoj status.
- prioritet_reda :: top (): Vraća referencu na najviši element reda prioriteta.
- prioritet_reda :: push (): Dodaje stavku na kraju reda prioriteta.
- prioritet_reda :: pop (): Uklanja prvi element iz reda prioriteta.
- prioritet_reda :: swap (): Koristi se za zamjenu sadržaja jednog reda prioriteta s drugim iste vrste i veličine.
- vrsta vrijednosti reda prioriteta: Tip vrijednosti daje vrstu elementa pohranjenog unutar reda prioriteta. Ovo također djeluje kao sinonim za parametar predloška.
- prioritet_reda :: emplace (): Koristi se za umetanje novog elementa u spremnik s prioritetnim redom na vrhu reda.
U sljedećem programu vidjet ćemo funkcionalnost reda prioriteta u STL-u na 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; }
Izlaz:
podatkovni okvir u primjeru selenovog webdrivera
Veličina reda (pq.size ()): 5
Gornji element reda (pq.top ()): 9
Prioritetni red pq je: 9 7 5 3 1
Prioritetni red, nakon operacije pq.pop (): 7 5 3 1
Implementacija Jave za prioritetni red
Prioritetni red u javi je poseban red u kojem su svi elementi u redu poredani prema prirodnom redoslijedu ili prilagođenom redoslijedu pomoću usporedbe isporučene s redom.
Prioritetni red u Javi izgleda kako je prikazano u nastavku:
U Java prioritetnom redu elementi su poredani tako da je najmanji element na čelu, a najveći na stražnjem dijelu. Dakle, kada uklonimo element iz reda prioriteta, to je uvijek najmanji element koji se uklanja.
Klasa koja implementira prioritetni red u Javi je 'PriorityQueue' i dio je okvira zbirki Java. Primjenjuje sučelje Java “Queue”.
Slijedi hijerarhija klasa za klasu Java PriorityQueue.
Dolje je dat primjer funkcije prioritetnog reda s cijelim brojevima kao stavkama u Javi.
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 Izlaz:
peek () :: Vrijednost glave: 1
Prioritetni red:
1 3 5 7
Nakon funkcije poll (), red prioriteta:
3 7 5
Nakon funkcije Ukloni (5), red prioriteta:
3 7
Prioritetni red sadrži 3 ?: točno
Elementi niza:
Vrijednost: 3
Vrijednost: 7
U gore navedenom programu koristimo klasu PriorityQueue Java kako bismo stvorili objekt PriorityQueue koji sadrži objekt Integer. Elemente dodajemo u red pomoću funkcije 'dodaj'. Tada se poziva funkcija poll () i ona briše element s prednje strane reda koji je najmanje element.
Opet pozivamo funkciju 'remove ()' koja uklanja element naveden kao parametar iz reda. Također koristimo funkciju “Sadrži ()” da provjerimo je li određeni element prisutan u redu čekanja. Na kraju, pretvaramo red u objekt niza pomoću funkcije 'toArray ()'.
Primjena
- Rukovanje uravnoteženjem opterećenja i prekida operativnog sustava: Funkcije operativnog sustava poput uravnoteženja opterećenja i rukovanja prekidima provode se pomoću prioritetnih redova. Aktivnost uravnoteženja tereta planira resurse s najvišim prioritetom kako bi učinkovito izvršila naše uravnoteženje tereta. Obrada prekida izvodi se servisiranjem prekida s najvišim prioritetom. Ova se funkcionalnost može učinkovito implementirati pomoću prioritetnih redova.
- Usmjeravanje: Usmjeravanje je funkcija koja se koristi za usmjeravanje mrežnih resursa tako da dobijemo maksimalnu propusnost uz minimalno vrijeme obrade. To se također može implementirati pomoću reda prioriteta.
- Hitna bolnica: U bolničkoj hitnoj pomoći pacijenti se pohađaju ovisno o tome koliko je teško stanje pacijenta. To se može simulirati pomoću prioritetnih redova.
- Dijkstrin najkraći algoritam puta: Ovdje je graf pohranjen kao popis susjedstva i možemo koristiti prioritetni red za učinkovito izdvajanje minimalno ponderiranog ruba s popisa susjedstva kako bismo implementirali Dijkstrin najkraći algoritam puta.
- Prioritetni red također se može koristiti za spremanje ključeva čvora i izdvajanje minimalnog čvora ključa tijekom implementacije obuhvaćajućeg stabla.
Zaključak
Prioritetni redovi nisu ništa drugo do produženje reda. No, za razliku od redova koji dodaju / uklanjaju stavke pomoću FIFO pristupa, u prioritetnom redu stavke se uklanjaju iz reda prema prioritetu. Stoga je svaka stavka u redu povezana s prioritetom, a stavka s najvišim prioritetom prva je koja se uklanja iz reda.
Prioritetni red ima tri glavne operacije, tj. Insert (), getHighestPriority () i deleteHighestPriority (). Prioritetni red može se implementirati pomoću polja ili povezanog popisa, ali rad nije vrlo učinkovit. Prioritetni red također se može implementirati pomoću gomila, a izvedba je puno brža.
U C ++-u imamo i klasu spremnika koja implementira funkcionalnost reda prioriteta. U Javi postoji ugrađena klasa priority_queue koja pruža funkcionalnost reda prioriteta.
Prioritetni red uglavnom se koristi u aplikacijama koje zahtijevaju obradu stavki prema prioritetu. Na primjer, koristi se u rukovanju prekidima.
U našem nadolazećem vodiču istražit će se sve o kružnom redu, što je još jedno produženje reda.
=> Posjetite ovdje za cjeloviti tečaj stručnjaka za C ++.
Preporučena literatura
- Struktura podataka u redu čekanja u C ++ s ilustracijom
- Redoslijed prioriteta u STL-u
- Složite strukturu podataka u C ++ s ilustracijom
- Kružno povezana struktura podataka popisa na C ++ s ilustracijom
- Povezana struktura podataka popisa na C ++ s ilustracijom
- Dvostruko povezana struktura podataka popisa na C ++ s ilustracijom
- Uvod u strukture podataka na C ++
- Kako testirati red primanja poruka: Uvod u IBM WebSphere MQ