logo

Пріоритетна черга в Python

Пріоритетні черги це абстрактні структури даних, де кожне дані/значення в черзі мають певний пріоритет. Наприклад, в авіакомпаніях багаж під назвою Business або First-class прибуває раніше за інших.

Пріоритетна черга — це розширення черги з такими властивостями.

  1. Елемент з високим пріоритетом вилучається з черги перед елементом з низьким пріоритетом.
  2. Якщо два елементи мають однаковий пріоритет, вони обслуговуються відповідно до свого порядку в черзі.
    різноманітні програми Пріоритетної черги в інформатиці є:
    Алгоритми планування завдань, планування процесора та диска, керування ресурсами, які спільно використовуються різними процесами тощо.

Ключові відмінності між пріоритетною чергою та чергою:



  1. У Queue найстаріший елемент вилучається з черги першим. Тоді як у пріоритетній черзі елемент, заснований на найвищому пріоритеті, виключається з черги.
  2. Коли елементи вириваються з черги пріоритету, отриманий результат сортується або в порядку зростання, або в порядку зменшення. Тоді як, коли елементи витягуються з простої черги, у результаті отримується порядок даних FIFO.

Нижче a проста реалізація пріоритетної черги.

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

>

>

Вихід:

12 1 14 7 14 12 7 1>

Зауважте, що часова складність видалення становить O(n) у наведеному вище коді. А краща реалізація це використовувати Бінарна купа який зазвичай використовується для реалізації пріоритетної черги. Зауважте, що Python надає heapq в бібліотеці також.

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