priority queue data structure c with illustration
Uvod v prednostno vrsto v jeziku C ++ z ilustracijo.
Priority Queue je razširitev čakalne vrste, o kateri smo razpravljali v naši zadnji vadnici.
V nekaterih vidikih je podoben čakalni vrsti, vendar se od običajne čakalne vrste razlikuje v naslednjih točkah:
- Vsak element v čakalni vrsti prioritet je povezan s prioriteto.
- Element z najvišjo prioriteto je prvi element, ki je odstranjen iz čakalne vrste.
- Če ima več postavk enako prednost, se upošteva njihov vrstni red v čakalni vrsti.
=> Kliknite tukaj za absolutno serijo usposabljanj C ++.
Prednostno čakalno vrsto si lahko predstavljamo kot spremenjeno različico čakalne vrste, le da je element, ki ga želimo odstraniti iz čakalne vrste, najprej priklican. Torej raje uporabljamo prioritetne čakalne vrste namesto čakalnih vrst, kadar moramo elemente obdelati glede na prednostne naloge.
Kaj se boste naučili:
- Osnovne operacije
- Ilustracija
- Izvajanje prioritetnih čakalnih vrst v C ++
- Uporaba
- Zaključek
- Priporočeno branje
Osnovne operacije
Pogovorimo se o nekaterih osnovnih operacijah, ki jih podpira prednostna vrsta.
- Vstavi (element, prednost): Vstavi element v prednostno vrsto z dano prednostjo.
- getHighestPriority (): Vrne element z najvišjo prioriteto.
- deleteHighestPriority (): Odstrani element z najvišjo prioriteto.
Poleg zgornjih operacij lahko uporabimo tudi običajne operacije čakalne vrste, kot so isEmpty (), isFull () in peek ().
Ilustracija
Oglejmo si ponazoritev prednostne čakalne vrste. Zaradi poenostavitve bomo kot elemente v prednostni vrsti uporabili znake ASCII. Višja kot je vrednost ASCII, večja je prednost.
Začetno stanje - Prednostna vrsta (PQ) - {} => prazno
Iz zgornje ilustracije vidimo, da je postopek vstavljanja podoben običajni čakalni vrsti. Ko pa za čakalno vrsto prioritet pokličemo »deleteHighestPriority«, se najprej odstrani element z najvišjo prioriteto.
Zato je prvič, ko pokličemo to funkcijo, odstranjena postavka O, drugič pa postavka M, ker ima večjo prednost kot G in A.
Izvajanje prioritetnih čakalnih vrst v C ++
Prednostne čakalne vrste je mogoče izvajati z uporabo:
# 1) Nizi / povezani seznami
Prednostne čakalne vrste lahko izvedemo z uporabo nizov in to je najpreprostejša izvedba za prednostne čakalne vrste.
Za predstavitev elementov v prednostni čakalni vrsti lahko samo prijavimo strukturo, kot je prikazano spodaj:
struct pq_item{ int item; int priority; };
Za vsako postavko smo razglasili tudi prednost.
Če želite v prednostno vrsto vstaviti novo postavko, jo preprosto vstavite na konec polja.
Če želimo element dobiti iz čakalne vrste z uporabo getHighestPriority (), moramo matriko prehoditi od začetka in vrniti element z najvišjo prioriteto.
Podobno, da odstranimo element iz čakalne vrste z operacijo deleteHighestPriority, moramo prehoditi celotno matriko in izbrisati element z najvišjo prioriteto. Nato premaknite vse ostale elemente za izbrisanim elementom za en položaj nazaj.
Tudi prednostno čakalno vrsto lahko implementiramo s povezanim seznamom. Vse operacije lahko izvajamo na podoben način kot nizi. Edina razlika je v tem, da po klicu deleteHighestPriority elementov ni treba premikati.
# 2) Kupe
Uporaba kup za izvajanje prednostne čakalne vrste je najučinkovitejši način in zagotavlja veliko boljšo zmogljivost v primerjavi s povezanimi seznami in nizi. V nasprotju s povezanim seznamom in matriko izvedba kopice traja O (logn) čas za operacije vstavljanja in brisanja prednostne čakalne vrste. Pridobite operacijo, getHighestPriority traja čas O (1).
# 3) Vgrajena prednostna vrsta v standardni knjižnici predlog (STL) v C ++
V C ++ imamo prednostno čakalno vrsto kot prilagodljivi razred vsebnika, zasnovan tako, da je najvišji element prvi element v čakalni vrsti in so vsi elementi v padajočem vrstnem redu.
Tako ima vsak element v čakalni vrsti s prednostjo določeno prednost.
Imamo razred v STL, ki vsebuje izvajanje prednostne čakalne vrste.
Različne operacije, ki jih podpira prednostna vrsta, so naslednje:
- prioritetna_vrst :: velikost (): Vrne velikost čakalne vrste.
- prioritetna_vrsta :: prazno (): Preveri, ali je vrsta prazna, in vrne svoje stanje.
- prioritetna_vrstica :: top (): Vrne sklic na najvišji element prednostne čakalne vrste.
- prioritetna_vrsta :: push (): Doda element na koncu prednostne čakalne vrste.
- prioritetna_vrstica :: pop (): Odstrani prvi element iz prednostne čakalne vrste.
- prioritetna vrsta :: swap (): Uporablja se za zamenjavo vsebine ene prednostne čakalne vrste z drugo iste vrste in velikosti.
- vrsta vrednosti prednostne čakalne vrste: Tip vrednosti daje vrsto elementa, shranjenega v prednostni vrsti. To je tudi sinonim za parameter predloge.
- prioritetna_vrsta :: emplace (): Uporablja se za vstavljanje novega elementa v vsebnik s prednostno čakalno vrsto na vrhu čakalne vrste.
V naslednjem programu bomo videli funkcionalnost prednostne čakalne vrste v STL v jeziku 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; }
Izhod:
kakšna je razlika med testnim načrtom in testno strategijo
Velikost čakalne vrste (pq.size ()): 5
Zgornji element čakalne vrste (pq.top ()): 9
Prednostna vrsta pq je: 9 7 5 3 1
Prednostna vrsta po operaciji pq.pop (): 7 5 3 1
Izvajanje Java za prioritetno čakalno vrsto
Prednostna vrsta v javi je posebna čakalna vrsta, kjer so vsi elementi v čakalni vrsti razvrščeni po naravnem naročilu ali po naročilu po meri z uporabo primerjalnika, ki je priložen čakalni vrsti.
Prednostna vrsta v Javi je videti, kot je prikazano spodaj:
V prioritetni vrsti Java so elementi razporejeni tako, da je najmanj element na sprednji strani čakalne vrste, največji pa na zadnjem delu čakalne vrste. Torej, ko element odstranimo iz prednostne čakalne vrste, je to vedno najmanjši element, ki je odstranjen.
Razred, ki implementira prioritetno čakalno vrsto v Javi, je “PriorityQueue” in je del okvira zbirk Java. Izvaja vmesnik Java “Queue”.
Sledi hierarhija razredov za razred Java PriorityQueue.
Spodaj je primer funkcije prednostne vrste s celoštevilskimi številkami kot elementi v 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 Izhod:
peek () :: Vrednost glave: 1
Prednostna vrsta:
1 3 5 7
Po poll () funkcija, prednostna vrsta:
3 7 5
Po funkciji Odstrani (5) je prednostna vrsta:
3 7
Prednostna vrsta vsebuje 3 ?: true
Elementi matrike:
Vrednost: 3
Vrednost: 7
V zgornjem programu uporabljamo razred PriorityQueue Java, da ustvarimo objekt PriorityQueue, ki vsebuje objekt Integer. Elemente v čakalno vrsto dodajamo s funkcijo »dodaj«. Nato se pokliče funkcija poll () in element izbriše s sprednje strani čakalne vrste, ki je najmanj element.
Spet pokličemo funkcijo “remove ()”, ki iz čakalne vrste odstrani element, določen kot parameter. Uporabljamo tudi funkcijo “Contains ()”, da preverimo, ali je določen element prisoten v čakalni vrsti. Na koncu pretvorimo čakalno vrsto v objekt matrike s pomočjo funkcije “toArray ()”.
Uporaba
- Izravnalniki obremenitve in prekinitve operacijskega sistema: Funkcije operacijskega sistema, kot so uravnoteženje obremenitve in obdelava prekinitev, se izvajajo s prednostnimi čakalnimi vrstami. Dejavnost uravnoteženja obremenitve razporeja vire z najvišjo prioriteto, da učinkovito izvaja naše uravnoteženje obremenitve. Obravnavanje prekinitev se izvaja s servisiranjem prekinitev z najvišjo prioriteto. To funkcionalnost je mogoče učinkovito uporabiti s prednostnimi čakalnimi vrstami.
- Usmerjanje: Usmerjanje je funkcija, ki se uporablja za usmerjanje omrežnih virov, tako da dobimo največjo pretočnost z minimalnim časom preoblikovanja. To lahko izvedemo tudi s prednostno čakalno vrsto.
- Nujna bolnišnica: V bolnišnični nujni sobi so bolniki prisotni glede na to, kako hudo je stanje bolnika. To je mogoče simulirati s prednostnimi čakalnimi vrstami.
- Dijkstrin najkrajši algoritem poti: Tu je graf shranjen kot seznam sosednosti in lahko uporabimo prednostno vrsto, da iz seznama sosednosti učinkovito izvlečemo najmanjši tehtani rob, da uporabimo Dijkstrin najkrajši algoritem poti.
- Prednostno čakalno vrsto lahko uporabite tudi za shranjevanje ključev vozlišča in izvlečenje najmanjšega vozlišča ključa med izvajanjem razteznega drevesa.
Zaključek
Prednostne čakalne vrste niso nič drugega kot podaljšanje čakalne vrste. Toda v nasprotju s čakalnimi vrstami, ki dodajajo / odstranjujejo elemente s pristopom FIFO, se v prednostni čakalni vrsti elementi odstranijo iz čakalne vrste glede na prednost. Tako je vsak element v čakalni vrsti povezan s prednostjo, element z najvišjo prioriteto pa je prvi, ki je odstranjen iz čakalne vrste.
Prednostna vrsta ima tri glavne operacije, to je insert (), getHighestPriority () in deleteHighestPriority (). Prednostno čakalno vrsto je mogoče izvesti z uporabo nizov ali povezanega seznama, vendar delo ni zelo učinkovito. Prednostno čakalno vrsto je mogoče implementirati tudi s pomočjo kopic in zmogljivost je veliko hitrejša.
V C ++ imamo tudi razred vsebnika, ki izvaja funkcionalnost prednostne čakalne vrste. V Javi je vgrajen razred priority_queue, ki zagotavlja funkcionalnost prednostne čakalne vrste.
Prednostna vrsta se v glavnem uporablja v aplikacijah, ki zahtevajo obdelavo elementov glede na prednost. Na primer, uporablja se pri obdelavi prekinitev.
Naša prihajajoča vadnica bo raziskala vse o krožni vrsti, ki je še ena razširitev čakalne vrste.
=> Obiščite tukaj za celoten tečaj strokovnjakov za C ++.
Priporočeno branje
- Struktura podatkov čakalne vrste v jeziku C ++ z ilustracijo
- Prednostna vrsta v STL
- Struktura podatkov skladov v jeziku C ++ z ilustracijo
- Struktura podatkov krožnega povezanega seznama v jeziku C ++ z ilustracijo
- Struktura povezanih seznamov podatkov v jeziku C ++ z ilustracijo
- Dvojno povezana podatkovna struktura seznama v jeziku C ++ z ilustracijo
- Uvod v podatkovne strukture v jeziku C ++
- Kako preizkusiti čakalno vrsto sporočil: Vadnica za IBM WebSphere MQ Intro