logo

Čo je prioritný front?

Prioritný front je abstraktný dátový typ, ktorý sa správa podobne ako normálny front s tým rozdielom, že každý prvok má určitú prioritu, t. j. prvok s najvyššou prioritou bude v prioritnom rade na prvom mieste. Priorita prvkov v prioritnom fronte určí poradie, v ktorom budú prvky odstránené z prioritného frontu.

Prioritný front podporuje iba porovnateľné prvky, čo znamená, že prvky sú usporiadané vzostupne alebo zostupne.

reverzný reťazec java

Predpokladajme napríklad, že máme nejaké hodnoty ako 1, 3, 4, 8, 14, 22 vložené do prioritného frontu s usporiadaním uloženým hodnotám od najmenšieho po najväčšiu. Preto číslo 1 bude mať najvyššiu prioritu, zatiaľ čo číslo 22 bude mať najnižšiu prioritu.

Charakteristiky prioritného frontu

Prioritný front je rozšírenie frontu, ktoré obsahuje nasledujúce charakteristiky:

  • Každý prvok v prioritnom fronte má priradenú nejakú prioritu.
  • Prvok s vyššou prioritou bude vymazaný pred odstránením s nižšou prioritou.
  • Ak majú dva prvky v prioritnom rade rovnakú prioritu, budú usporiadané podľa princípu FIFO.

Poďme pochopiť prioritný front prostredníctvom príkladu.

Máme prioritný front, ktorý obsahuje nasledujúce hodnoty:

1, 3, 4, 8, 14, 22

Všetky hodnoty sú usporiadané vo vzostupnom poradí. Teraz budeme sledovať, ako bude prioritný front vyzerať po vykonaní nasledujúcich operácií:

    anketa():Táto funkcia odstráni prvok s najvyššou prioritou z prioritného frontu. Vo vyššie uvedenom prioritnom rade má prvok '1' najvyššiu prioritu, takže bude odstránený z prioritného radu.pridať (2):Táto funkcia vloží prvok '2' do prioritného frontu. Keďže 2 je najmenší prvok spomedzi všetkých čísel, získa najvyššiu prioritu.anketa():Odstráni prvok '2' z prioritného frontu, pretože má front s najvyššou prioritou.pridať (5):Vloží 5 prvkov za 4, pretože 5 je väčšie ako 4 a menšie ako 8, takže získa tretiu najvyššiu prioritu v prioritnom rade.

Typy prioritného frontu

Existujú dva typy prioritných frontov:

    Vzostupný poradie priority:Vo fronte s prioritou vzostupného poradia je číslo s nižšou prioritou dané ako vyššia priorita v priorite. Napríklad zoberieme čísla od 1 do 5 usporiadané vo vzostupnom poradí ako 1,2,3,4,5; preto najmenšie číslo, t.j. 1, má najvyššiu prioritu v prioritnom rade.
    Prioritný front Zostupný rad priority objednávky:Vo fronte priority zostupného poradia je v priorite priradené číslo s vyššou prioritou ako vyššia priorita. Napríklad zoberieme čísla od 1 do 5 usporiadané v zostupnom poradí ako 5, 4, 3, 2, 1; preto je najvyššie číslo, t.j. 5, dané ako najvyššia priorita v prioritnom rade.
    Prioritný front

Zastúpenie prioritného frontu

Teraz uvidíme, ako reprezentovať prioritný front prostredníctvom jednosmerného zoznamu.

Prioritný front vytvoríme pomocou nižšie uvedeného zoznamu, v ktorom INFO zoznam obsahuje dátové prvky, PRN zoznam obsahuje čísla priority každého dátového prvku dostupného v INFO zoznam a LINK v podstate obsahuje adresu nasledujúceho uzla.

Prioritný front

Vytvorme prioritný front krok za krokom.

java sort arraylist

V prípade prioritného frontu sa za vyššiu prioritu považuje číslo s nižšou prioritou, t.j. nižšie číslo priority = vyššia priorita.

Krok 1: Číslo s nižšou prioritou v zozname je 1, ktorého hodnota údajov je 333, takže bude vložené do zoznamu, ako je znázornené na obrázku nižšie:

Krok 2: Po vložení 333 má priorita číslo 2 vyššiu prioritu a hodnoty údajov priradené k tejto priorite sú 222 a 111. Tieto údaje sa teda vložia na základe princípu FIFO; preto sa najprv pridá 222 a potom 111.

Krok 3: Po vložení prvkov priority 2 je najbližšie vyššie prioritné číslo 4 a dátové prvky spojené so 4 prioritnými číslami sú 444, 555, 777. V tomto prípade by sa prvky vložili na základe princípu FIFO; preto sa najprv pridá 444, potom 555 a potom 777.

Krok 4: Po vložení prvkov priority 4 je najbližšie vyššie číslo priority 5 a hodnota spojená s prioritou 5 je 666, takže bude vložená na koniec frontu.

Prioritný front

Implementácia prioritného frontu

Prioritný front môže byť implementovaný štyrmi spôsobmi, ktoré zahŕňajú polia, prepojený zoznam, štruktúru údajov haldy a binárny vyhľadávací strom. Štruktúra údajov haldy je najefektívnejším spôsobom implementácie prioritného frontu, preto v tejto téme implementujeme prioritný front pomocou štruktúry údajov haldy. Teraz najprv pochopíme dôvod, prečo je halda najefektívnejším spôsobom spomedzi všetkých ostatných dátových štruktúr.

Analýza zložitosti pomocou rôznych implementácií

Implementácia pridať Odstrániť nahliadnuť
Prepojený zoznam O(1) O(n) O(n)
Binárna halda O(logn) O(logn) O(1)
Binárny vyhľadávací strom O(logn) O(logn) O(1)

Čo je Heap?

Halda je stromová dátová štruktúra, ktorá tvorí úplný binárny strom a spĺňa vlastnosť haldy. Ak je A nadradený uzol B, potom A je usporiadané vzhľadom na uzol B pre všetky uzly A a B v halde. Znamená to, že hodnota nadradeného uzla môže byť väčšia alebo rovná hodnote podriadeného uzla, alebo hodnota nadradeného uzla môže byť menšia alebo rovná hodnote podriadeného uzla. Preto môžeme povedať, že existujú dva typy kôp:

    Maximálna hromada:Maximálna halda je halda, v ktorej je hodnota nadradeného uzla väčšia ako hodnota podriadených uzlov.
    Prioritný front Minimálna hromada:Minimálna halda je halda, v ktorej je hodnota nadradeného uzla menšia ako hodnota podriadených uzlov.
    Prioritný front

Obidve haldy sú binárnou haldou, pretože každá má presne dva podriadené uzly.

Prioritné operácie frontu

Bežné operácie, ktoré môžeme vykonávať na prioritnom fronte, sú vkladanie, mazanie a nahliadnutie. Pozrime sa, ako môžeme zachovať štruktúru údajov haldy.

    Vloženie prvku do prioritného frontu (maximálna halda)

Ak vložíme prvok do prioritného frontu, presunie sa do prázdneho slotu pohľadom zhora nadol a zľava doprava.

ako zistiť veľkosť monitora

Ak prvok nie je na správnom mieste, potom sa porovná s nadradeným uzlom; ak sa zistí nefunkčnosť, prvky sa vymenia. Tento proces pokračuje, kým nie je prvok umiestnený v správnej polohe.

Prioritný front
Prioritný front
    Odstránenie minimálneho prvku z prioritného frontu

Ako vieme, v maximálnej halde je maximálnym prvkom koreňový uzol. Keď odstránime koreňový uzol, vytvorí sa prázdny slot. Posledný vložený prvok bude pridaný do tohto prázdneho slotu. Potom sa tento prvok porovná s podriadenými uzlami, t. j. ľavým a pravým potomkom, a vymení sa s menším z dvoch. Stále sa pohybuje po strome, kým sa vlastnosť haldy neobnoví.

Aplikácie prioritného frontu

Nasledujú aplikácie prioritného frontu:

  • Používa sa v Dijkstrovom algoritme najkratšej cesty.
  • Používa sa v primovom algoritme
  • Používa sa v technikách kompresie údajov, ako je Huffmanov kód.
  • Používa sa pri triedení haldy.
  • Používa sa aj v operačnom systéme, ako je plánovanie priorít, vyrovnávanie záťaže a manipulácia s prerušením.

Program na vytvorenie prioritného frontu pomocou binárnej maximálnej haldy.

 #include #include int heap[40]; int size=-1; // retrieving the parent node of the child node int parent(int i) { return (i - 1) / 2; } // retrieving the left child of the parent node. int left_child(int i) { return i+1; } // retrieving the right child of the parent int right_child(int i) { return i+2; } // Returning the element having the highest priority int get_Max() { return heap[0]; } //Returning the element having the minimum priority int get_Min() { return heap[size]; } // function to move the node up the tree in order to restore the heap property. void moveUp(int i) { while (i &gt; 0) { // swapping parent node with a child node if(heap[parent(i)] <heap[i]) 2 { int temp; temp="heap[parent(i)];" heap[parent(i)]="heap[i];" heap[i]="temp;" } updating the value of i to function move node down tree in order restore heap property. void movedown(int k) index="k;" getting location left child if (left heap[index]) right (right k is not equal (k !="index)" heap[index]="heap[k];" heap[k]="temp;" movedown(index); removing element maximum priority removemax() r="heap[0];" heap[0]="heap[size];" size="size-1;" movedown(0); inserting a queue insert(int p) + 1; heap[size]="p;" up maintain property moveup(size); from at given i. delete(int i) stored ith shifted root moveup(i); having removemax(); main() elements insert(20); insert(19); insert(21); insert(18); insert(12); insert(17); insert(15); insert(16); insert(14); printf('elements are : '); for(int printf('%d ',heap[i]); delete(2); deleting whose 2. printf('
elements after max="get_Max();" printf('
the which highest %d: ',max); min="get_Min();" minimum %d',min); return 0; < pre> <p> <strong>In the above program, we have created the following functions:</strong> </p> <ul> <tr><td>int parent(int i):</td> This function returns the index of the parent node of a child node, i.e., i. </tr><tr><td>int left_child(int i):</td> This function returns the index of the left child of a given index, i.e., i. </tr><tr><td>int right_child(int i):</td> This function returns the index of the right child of a given index, i.e., i. </tr><tr><td>void moveUp(int i):</td> This function will keep moving the node up the tree until the heap property is restored. </tr><tr><td>void moveDown(int i):</td> This function will keep moving the node down the tree until the heap property is restored. </tr><tr><td>void removeMax():</td> This function removes the element which is having the highest priority. </tr><tr><td>void insert(int p):</td> It inserts the element in a priority queue which is passed as an argument in a function <strong>.</strong>  </tr><tr><td>void delete(int i):</td> It deletes the element from a priority queue at a given index. </tr><tr><td>int get_Max():</td> It returns the element which is having the highest priority, and we know that in max heap, the root node contains the element which has the largest value, and highest priority. </tr><tr><td>int get_Min():</td> It returns the element which is having the minimum priority, and we know that in max heap, the last node contains the element which has the smallest value, and lowest priority. </tr></ul> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/03/what-is-priority-queue-9.webp" alt="Priority Queue"> <hr></heap[i])>