logo

Ce este o coadă prioritară?

O coadă cu prioritate este un tip de date abstracte care se comportă similar cu o coadă normală, cu excepția faptului că fiecare element are o anumită prioritate, adică elementul cu cea mai mare prioritate ar fi primul într-o coadă de prioritate. Prioritatea elementelor dintr-o coadă de prioritate va determina ordinea în care elementele sunt eliminate din coada de prioritate.

Coada de prioritate acceptă numai elemente comparabile, ceea ce înseamnă că elementele sunt fie aranjate în ordine crescătoare, fie în ordine descrescătoare.

df loc

De exemplu, să presupunem că avem niște valori precum 1, 3, 4, 8, 14, 22 introduse într-o coadă de prioritate cu o ordonare impusă valorilor de la cel mai mic la cel mai mare. Prin urmare, numărul 1 va avea cea mai mare prioritate, în timp ce 22 va avea cea mai mică prioritate.

Caracteristicile unei cozi de prioritate

O coadă prioritară este o extensie a unei cozi care conține următoarele caracteristici:

  • Fiecare element dintr-o coadă de prioritate are o anumită prioritate asociată cu el.
  • Un element cu prioritate mai mare va fi șters înainte de ștergerea priorității mai mici.
  • Dacă două elemente dintr-o coadă de prioritate au aceeași prioritate, acestea vor fi aranjate folosind principiul FIFO.

Să înțelegem coada de priorități printr-un exemplu.

Avem o coadă de prioritate care conține următoarele valori:

1, 3, 4, 8, 14, 22

Toate valorile sunt aranjate în ordine crescătoare. Acum, vom observa cum va arăta coada de prioritate după efectuarea următoarelor operațiuni:

    sondaj():Această funcție va elimina elementul cu cea mai mare prioritate din coada de prioritate. În coada de prioritate de mai sus, elementul „1” are cea mai mare prioritate, deci va fi eliminat din coada de prioritate.adăugați (2):Această funcție va insera elementul „2” într-o coadă de prioritate. Deoarece 2 este cel mai mic element dintre toate numerele, va obține cea mai mare prioritate.sondaj():Acesta va elimina elementul „2” din coada de prioritate, deoarece are cea mai mare prioritate.adăugați (5):Va insera 5 elemente după 4, deoarece 5 este mai mare decât 4 și mai mic de 8, deci va obține a treia cea mai mare prioritate într-o coadă de prioritate.

Tipuri de coadă prioritară

Există două tipuri de coadă de prioritate:

    Coada de prioritate pentru ordine crescătoare:În coada de prioritate în ordine crescătoare, un număr cu prioritate mai mică este dat ca prioritate mai mare într-o prioritate. De exemplu, luăm numerele de la 1 la 5 aranjate în ordine crescătoare precum 1,2,3,4,5; prin urmare, cel mai mic număr, adică 1 este dat ca cea mai mare prioritate într-o coadă de prioritate.
    Coada prioritară Coada de prioritate pentru ordinea descendentă:În coada de prioritate în ordine descrescătoare, un număr de prioritate mai mare este dat ca prioritate mai mare într-o prioritate. De exemplu, luăm numerele de la 1 la 5 aranjate în ordine descrescătoare ca 5, 4, 3, 2, 1; prin urmare, cel mai mare număr, adică 5 este dat ca cea mai mare prioritate într-o coadă de prioritate.
    Coada prioritară

Reprezentarea cozii de prioritate

Acum, vom vedea cum să reprezentăm coada de prioritate printr-o listă unidirecțională.

Vom crea coada de prioritate folosind lista de mai jos în care INFO lista conține elementele de date, PRN lista conține numerele de prioritate ale fiecărui element de date disponibil în INFO listă, iar LINK conține practic adresa următorului nod.

Coada prioritară

Să creăm coada de prioritate pas cu pas.

ștergerea cache-ului npm

În cazul cozii cu prioritate, numărul cu prioritate mai mică este considerat cu prioritate mai mare, adică număr cu prioritate mai mică = prioritate mai mare.

Pasul 1: În listă, numărul cu prioritate inferioară este 1, a cărui valoare a datelor este 333, deci va fi inserat în listă așa cum se arată în diagrama de mai jos:

Pasul 2: După introducerea 333, numărul de prioritate 2 are o prioritate mai mare, iar valorile datelor asociate cu această prioritate sunt 222 și 111. Deci, aceste date vor fi inserate pe baza principiului FIFO; prin urmare, se vor adăuga mai întâi 222 și apoi 111.

Pasul 3: După introducerea elementelor de prioritate 2, următorul număr de prioritate mai mare este 4 și elementele de date asociate cu 4 numere de prioritate sunt 444, 555, 777. În acest caz, elementele ar fi inserate pe baza principiului FIFO; prin urmare, se vor adăuga mai întâi 444, apoi 555 și apoi 777.

Pasul 4: După introducerea elementelor de prioritate 4, următorul număr de prioritate mai mare este 5, iar valoarea asociată priorității 5 este 666, deci va fi inserat la sfârșitul cozii.

Coada prioritară

Implementarea Cozii prioritare

Coada de prioritate poate fi implementată în patru moduri, care includ matrice, listă legată, structura de date heap și arbore de căutare binar. Structura de date heap este cea mai eficientă modalitate de implementare a cozii de prioritate, așa că vom implementa coada de prioritate folosind o structură de date heap în acest subiect. Acum, mai întâi înțelegem motivul pentru care heap-ul este cel mai eficient mod dintre toate celelalte structuri de date.

Analiza complexităților folosind diferite implementări

Implementarea adăuga Elimina arunca o privire
Lista legată O(1) Pe) Pe)
Morman binar O(logn) O(logn) O(1)
Arborele de căutare binar O(logn) O(logn) O(1)

Ce este Heap?

Un heap este o structură de date bazată pe arbore care formează un arbore binar complet și satisface proprietatea heap. Dacă A este un nod părinte al lui B, atunci A este ordonat în raport cu nodul B pentru toate nodurile A și B dintr-un heap. Înseamnă că valoarea nodului părinte poate fi mai mare sau egală cu valoarea nodului copil, sau valoarea nodului părinte poate fi mai mică sau egală cu valoarea nodului copil. Prin urmare, putem spune că există două tipuri de grămezi:

    Heap maxim:Heap-ul maxim este un heap în care valoarea nodului părinte este mai mare decât valoarea nodurilor copil.
    Coada prioritară Heap min:Heap-ul min este un heap în care valoarea nodului părinte este mai mică decât valoarea nodurilor copil.
    Coada prioritară

Ambele grămezi sunt heap binar, deoarece fiecare are exact două noduri copil.

Operații prioritare în coadă

Operațiunile comune pe care le putem efectua într-o coadă prioritară sunt inserarea, ștergerea și vizualizarea. Să vedem cum putem menține structura de date heap.

    Inserarea elementului într-o coadă de prioritate (heap maxim)

Dacă introducem un element într-o coadă de prioritate, acesta se va muta în slotul gol privind de sus în jos și de la stânga la dreapta.

subliniați în markdown

Dacă elementul nu este într-un loc corect, atunci este comparat cu nodul părinte; dacă se găsește neregulat, elementele sunt schimbate. Acest proces continuă până când elementul este plasat într-o poziție corectă.

Coada prioritară
Coada prioritară
    Eliminarea elementului minim din coada de prioritate

După cum știm că într-un heap maxim, elementul maxim este nodul rădăcină. Când eliminăm nodul rădăcină, acesta creează un slot gol. Ultimul element inserat va fi adăugat în acest slot gol. Apoi, acest element este comparat cu nodurile copil, adică copilul stâng și copilul drept, și se schimbă cu cel mai mic dintre cele două. Continuă să se miște în jos în copac până când proprietatea heap este restaurată.

Aplicații de coadă de prioritate

Următoarele sunt aplicațiile cozii de prioritate:

  • Este folosit în algoritmul cu calea cea mai scurtă a lui Dijkstra.
  • Este folosit în algoritmul lui prim
  • Este folosit în tehnici de compresie a datelor, cum ar fi codul Huffman.
  • Este folosit în sortarea grămezilor.
  • Este, de asemenea, utilizat în sistemele de operare, cum ar fi programarea priorităților, echilibrarea sarcinii și gestionarea întreruperilor.

Program pentru a crea coada de prioritate folosind heap-ul maxim binar.

 #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])>