Kolejka priorytetowa w Pythonie

Kolejki priorytetowe to abstrakcyjne struktury danych, w których każde dane/wartość w kolejce mają określony priorytet. Na przykład w liniach lotniczych bagaż z tytułem Biznes lub Pierwsza klasa przybywa wcześniej niż reszta.

Kolejka priorytetowa jest rozszerzeniem kolejki o następujących właściwościach.

  1. Element o wysokim priorytecie jest usuwany z kolejki przed elementem o niskim priorytecie.
  2. Jeżeli dwa elementy mają ten sam priorytet, są obsługiwane zgodnie z kolejnością w kolejce.
    Różny Aplikacje kolejki Priorytetów w Informatyce to:
    Algorytmy planowania zadań, planowania procesora i dysku, zarządzanie zasobami współdzielonymi przez różne procesy itp.

Kluczowe różnice między kolejką priorytetową a kolejką:

  1. W Queue najstarszy element jest usuwany z kolejki jako pierwszy. Natomiast w kolejce priorytetowej element oparty na najwyższym priorytecie jest usuwany z kolejki.
  2. Gdy elementy zostaną usunięte z kolejki priorytetowej, uzyskany wynik zostanie posortowany w kolejności rosnącej lub malejącej. Natomiast gdy elementy są usuwane z prostej kolejki, w rezultacie uzyskuje się kolejność danych FIFO.

Poniżej znajduje się prosta implementacja z kolejki priorytetowej.

Pyton




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

Wyjście:

12 1 14 7 14 12 7 1 

Należy zauważyć, że w powyższym kodzie złożoność czasowa usuwania wynosi O(n). A lepsza realizacja jest używać Kopia binarna który jest zwykle używany do implementacji kolejki priorytetowej. Zauważ, że Python zapewnia sterta w bibliotece też.

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