logo

Co je prioritní fronta?

Prioritní fronta je abstraktní datový typ, který se chová podobně jako normální fronta s tím rozdílem, že každý prvek má nějakou prioritu, tj. prvek s nejvyšší prioritou by byl v prioritní frontě první. Priorita prvků v prioritní frontě bude určovat pořadí, ve kterém budou prvky odstraněny z prioritní fronty.

Prioritní fronta podporuje pouze srovnatelné prvky, což znamená, že prvky jsou uspořádány buď vzestupně, nebo sestupně.

Cassidy Hutchinson vzdělání

Předpokládejme například, že máme nějaké hodnoty jako 1, 3, 4, 8, 14, 22 vložené do prioritní fronty s pořadím uloženým hodnotám od nejmenší po největší. Proto číslo 1 bude mít nejvyšší prioritu, zatímco číslo 22 bude mít nejnižší prioritu.

Charakteristiky prioritní fronty

Prioritní fronta je rozšířením fronty, která obsahuje následující vlastnosti:

  • Každý prvek v prioritní frontě má přiřazenou nějakou prioritu.
  • Prvek s vyšší prioritou bude vymazán před smazáním s nižší prioritou.
  • Pokud mají dva prvky v prioritní frontě stejnou prioritu, budou uspořádány pomocí principu FIFO.

Pojďme pochopit prioritní frontu na příkladu.

Máme prioritní frontu, která obsahuje následující hodnoty:

1, 3, 4, 8, 14, 22

Všechny hodnoty jsou seřazeny ve vzestupném pořadí. Nyní uvidíme, jak bude prioritní fronta vypadat po provedení následujících operací:

    hlasování():Tato funkce odstraní prvek s nejvyšší prioritou z fronty s prioritou. Ve výše uvedené prioritní frontě má prvek '1' nejvyšší prioritu, takže bude odstraněn z prioritní fronty.přidat (2):Tato funkce vloží prvek '2' do prioritní fronty. Protože 2 je nejmenší prvek mezi všemi čísly, získá nejvyšší prioritu.hlasování():Odebere prvek '2' z fronty s prioritou, protože má frontu s nejvyšší prioritou.přidat (5):Vloží 5 prvků za 4, protože 5 je větší než 4 a menší než 8, takže získá třetí nejvyšší prioritu v prioritní frontě.

Typy prioritních front

Existují dva typy prioritních front:

    Fronta priority vzestupné objednávky:Ve frontě s prioritou vzestupného pořadí je číslo s nižší prioritou přiděleno jako vyšší priorita. Například vezmeme čísla od 1 do 5 uspořádaná ve vzestupném pořadí jako 1,2,3,4,5; proto nejmenší číslo, tj. 1, má nejvyšší prioritu v prioritní frontě.
    Prioritní fronta Sestupná fronta priority objednávky:Ve frontě s prioritou sestupného pořadí je přiděleno číslo s vyšší prioritou jako vyšší priorita v prioritě. Například vezmeme čísla od 1 do 5 uspořádaná v sestupném pořadí jako 5, 4, 3, 2, 1; proto je nejvyšší číslo, tj. 5, dáno jako nejvyšší priorita v prioritní frontě.
    Prioritní fronta

Zastoupení prioritní fronty

Nyní uvidíme, jak reprezentovat prioritní frontu prostřednictvím jednosměrného seznamu.

Prioritní frontu vytvoříme pomocí níže uvedeného seznamu, ve kterém INFO seznam obsahuje datové prvky, PRN seznam obsahuje čísla priority každého datového prvku dostupného v INFO seznam a LINK v podstatě obsahuje adresu dalšího uzlu.

Prioritní fronta

Vytvořme prioritní frontu krok za krokem.

java sort arraylist

V případě prioritní fronty se za vyšší prioritu považuje nižší číslo priority, tj. nižší číslo priority = vyšší priorita.

Krok 1: Číslo s nižší prioritou v seznamu je 1, jehož datová hodnota je 333, takže bude vložena do seznamu, jak je znázorněno na obrázku níže:

Krok 2: Po vložení 333 má priorita číslo 2 vyšší prioritu a datové hodnoty spojené s touto prioritou jsou 222 a 111. Tato data budou tedy vložena na základě principu FIFO; proto bude nejprve přidáno 222 a poté 111.

Krok 3: Po vložení prvků priority 2 je nejbližší vyšší prioritní číslo 4 a datové prvky spojené se 4 prioritními čísly jsou 444, 555, 777. V tomto případě by se prvky vkládaly na základě principu FIFO; proto bude nejprve přidáno 444, poté 555 a poté 777.

Krok 4: Po vložení prvků priority 4 je nejbližší vyšší číslo priority 5 a hodnota spojená s prioritou 5 je 666, takže bude vložena na konec fronty.

Prioritní fronta

Implementace prioritní fronty

Prioritní frontu lze implementovat čtyřmi způsoby, které zahrnují pole, propojený seznam, datovou strukturu haldy a binární vyhledávací strom. Struktura dat haldy je nejúčinnějším způsobem implementace prioritní fronty, proto v tomto tématu implementujeme prioritní frontu pomocí datové struktury haldy. Nyní nejprve chápeme důvod, proč je halda nejúčinnějším způsobem mezi všemi ostatními datovými strukturami.

Analýza složitosti pomocí různých implementací

Implementace přidat Odstranit nahlédnout
Spojový seznam O(1) Na) Na)
Binární halda O(logn) O(logn) O(1)
Binární vyhledávací strom O(logn) O(logn) O(1)

Co je Heap?

Halda je stromová datová struktura, která tvoří úplný binární strom a splňuje vlastnost haldy. Pokud je A nadřazený uzel B, pak A je uspořádáno vzhledem k uzlu B pro všechny uzly A a B v hromadě. Znamená to, že hodnota nadřazeného uzlu může být větší nebo rovna hodnotě podřízeného uzlu nebo hodnota nadřazeného uzlu může být menší nebo rovna hodnotě podřízeného uzlu. Můžeme tedy říci, že existují dva typy hald:

vycpávka css
    Maximální hromada:Maximální halda je halda, ve které je hodnota nadřazeného uzlu větší než hodnota podřízených uzlů.
    Prioritní fronta Min. hromada:Minimální halda je halda, ve které je hodnota nadřazeného uzlu menší než hodnota podřízených uzlů.
    Prioritní fronta

Obě haldy jsou binární haldy, protože každá má přesně dva podřízené uzly.

Prioritní operace fronty

Běžné operace, které můžeme provádět na prioritní frontě, jsou vkládání, mazání a prohlížení. Podívejme se, jak můžeme udržovat datovou strukturu haldy.

    Vložení prvku do prioritní fronty (maximální halda)

Pokud vložíme prvek do prioritní fronty, přesune se do prázdné pozice pohledem shora dolů a zleva doprava.

Pokud prvek není na správném místě, porovná se s nadřazeným uzlem; pokud je zjištěno mimo provoz, prvky se vymění. Tento proces pokračuje, dokud není prvek umístěn ve správné poloze.

Prioritní fronta
Prioritní fronta
    Odebrání minimálního prvku z fronty priority

Jak víme, v maximální hromadě je maximálním prvkem kořenový uzel. Když odstraníme kořenový uzel, vytvoří se prázdný slot. Poslední vložený prvek bude přidán do tohoto prázdného slotu. Poté se tento prvek porovná s podřízenými uzly, tj. s levým a pravým potomkem, a vymění se s menším z těchto dvou. Pohybuje se po stromě, dokud není obnovena vlastnost haldy.

Aplikace prioritní fronty

Níže jsou uvedeny aplikace prioritní fronty:

  • Používá se v Dijkstrově algoritmu nejkratší cesty.
  • Používá se v primově algoritmu
  • Používá se v technikách komprese dat, jako je Huffmanův kód.
  • Používá se v haldovém třídění.
  • Používá se také v operačním systému, jako je plánování priorit, vyvažování zátěže a zpracování přerušení.

Program pro vytvoření prioritní fronty pomocí binární maximální 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])>