To learn about Priority Queue, you must know:
- Python 3
- Linear Queue
- Basic Python data structure concepts - lists, tuples
What is a priority queue?
Before you go ahead and read this tutorial, I highly recommend you to read the previous tutorial on Queues and Circular Queues as it will give you a better foundation and help you grasp the the content here.
What would you do if you wanted to track the least played songs in your playlist? The easiest solution would be to sort the list but that is time-consuming and wasteful. You only have to keep track of the song with the least hits. A min heap or priority queue helps you do this.
Priority Queues, also known as heap queues, are abstract data structures. Heaps are binary trees where every parent node has a value less than or equal to any of its children. In other words, this type of queue keeps track of the minimum value. Thus it helps retrieve the minimum value at all times. For this reason, it is also referred to as min heap. Thus, position 0 holds the smallest/minimum value. There is also a max heap whose operation is quite similar.
Note: heap queues or priority queues don’t sort lists in ascending order. It just keeps the smallest element in its 0th position. The rest of the elements may or may not be sorted.
How To Implement Priority Queue
To use priority queue, you will have to import the heapq library. This is done as follows:
The following heap commands can be performed once the heapq module is imported:
- heapify() - this operation enables you to convert a regular list to a heap. On performing this operation, the smallest element gets pushed to position 0.
h = [5,2,6,8,0,1,2,4] heapq.heapify(h) #returns [0, 2, 1, 4, 5, 6, 2, 8]
Note: Only the first element is in its correct sorted position.
- heapq.heappush(heap, item) - this operation pushes an element into a heap. Heap refers to the name of the heap and item refers to the item to be added to the heap. For instance:
heapq.heappush(h,7) print(h) #[0, 2, 1, 4, 5, 6, 2, 8, 7]
Try adding a negative number and observe what happens.
- heapq.heappop(heap) - this operation is used to return the smallest element in the heap. Heap refers to the name of the heap.
heapq.heappop(h) #returns 0
- heapq.heappushpop(heap, item) - as the name suggests this command adds an item to the heap and returns the smallest number. This single command is much more efficient than a heappush() command followed by heappop() command.
heapq.heappushpop(h,3) #returns 0 print(h) #prints [1, 2, 2, 4, 5, 6, 3, 8, 7]
If you try the above command with a number smaller than the min value of heap, you will notice that the same element gets popped. For instance:
heapq.heappushpop(h,0) #returns 0 print(h) #prints [1, 2, 2, 4, 5, 6, 3, 8, 7]
- heapq.heapreplace(heap, item) -the above issue can be solved by executing this operation as it returns the smallest element and then adds the new element.
heapq.heapreplace(h,0) #returns 1 print(h) #prints [0, 2, 2, 4, 5, 6, 3, 8, 7]
The above-mentioned commands are the main ones you will use when dealing with heaps but there are also other general commands like merge(), nlargest() and nsmallest(). You can explore these on your own!
Priority Queues are widely used in different fields such as Artificial Intelligence, Statistics, Operating systems and in graphs.
Try solving the music player problem discussed in the introduction. You will need to heapify a list of tuples where each tuple should look like (number of hits, songid, name of the song). The heapify command will track the min according to the first element of the tuple which is why the first element of the tuple is the number of hits. Post your answers below. That’s it for this tutorial. Happy Pythoning!