Prioritetskø i Python

Prioriterede køer er abstrakte datastrukturer, hvor hver data/værdi i køen har en vis prioritet. For eksempel hos flyselskaber ankommer bagage med titlen Business eller First-class tidligere end resten.

Priority Queue er en udvidelse af køen med følgende egenskaber.

  1. Et element med høj prioritet sættes ud af kø før et element med lav prioritet.
  2. Hvis to elementer har samme prioritet, serveres de i henhold til deres rækkefølge i køen.
    Forskellige applikationer af prioritetskøen i datalogi er:
    Jobplanlægningsalgoritmer, CPU- og diskplanlægning, styring af ressourcer, der deles mellem forskellige processer osv.

Vigtigste forskelle mellem Priority Queue og Queue:

  1. I kø bliver det ældste element sat ud af kø først. Mens et element baseret på den højeste prioritet i Priority Queue bliver sat ud af køen.
  2. Når elementer springes ud af en prioriteret kø, sorteres det opnåede resultat enten i stigende rækkefølge eller i faldende rækkefølge. Mens, når elementer er poppet fra en simpel kø, opnås en FIFO rækkefølge af data i resultatet.

Nedenfor er en enkel implementering af prioritetskøen.

Python




# A simple implementation of Priority Queue> # using Queue.> class> PriorityQueue(> object> ):> > def> __init__(> self> ):> > self> .queue> => []> > def> __str__(> self> ):> > return> ' '> .join([> str> (i)> for> i> in> self> .queue])> > # for checking if the queue is empty> > def> isEmpty(> self> ):> > return> len> (> self> .queue)> => => 0> > # for inserting an element in the queue> > def> insert(> self> , data):> > self> .queue.append(data)> > # for popping an element based on Priority> > def> delete(> self> ):> > try> :> > max_val> => 0> > for> i> in> range> (> len> (> self> .queue)):> > if> self> .queue[i]>> self> .queue[max_val]:> > max_val> => i> > item> => self> .queue[max_val]> > del> self> .queue[max_val]> > return> item> > except> IndexError:> > print> ()> > exit()> if> __name__> => => '__main__'> :> > myQueue> => PriorityQueue()> > myQueue.insert(> 12> )> > myQueue.insert(> 1> )> > myQueue.insert(> 14> )> > myQueue.insert(> 7> )> > print> (myQueue)> > while> not> myQueue.isEmpty():> > print> (myQueue.delete())>

Produktion:

12 1 14 7 14 12 7 1 

Bemærk, at tidskompleksiteten for sletning er O(n) i ovenstående kode. EN bedre implementering er at bruge Binær bunke som typisk bruges til at implementere en prioriteret kø. Bemærk, at Python giver heapq også på biblioteket.

Time complexity: By using heap data structure to implement Priority Queues Insert Operation: O(log(n)) Delete Operation: O(log(n))