Skip to content

Commit

Permalink
Update priority_queue.py
Browse files Browse the repository at this point in the history
- refactor `insert` and `delete` -> `push` and `pop`. Because `pop` seems more natural while returning the deleted item (rather than `delete`)
- `push` now takes data and priority(optional), and constructs a `PriorityQueueNode` inside the method for inserting. This simplifies the usage.
- used `collections.deque()` for O(1) popleft operation.
- add `__repr__` method.
  • Loading branch information
goswami-rahul committed May 3, 2018
1 parent d890b34 commit b4cbaa4
Showing 1 changed file with 21 additions and 23 deletions.
44 changes: 21 additions & 23 deletions queues/priority_queue.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
"""
Implementation of priority queue
Implementation of priority queue using linear array.
Insertion - O(n)
Extract min/max Node - O(1)
"""
import collections


class PriorityQueueNode:
def __init__(self, data, priority):
Expand All @@ -12,30 +16,24 @@ def __repr__(self):

class PriorityQueue:
def __init__(self):
self.priority_queue_list = []
self.priority_queue_list = collections.deque()

def __repr__(self):
return "PriorityQueue({!r})".format(list(self.priority_queue_list))

def size(self):
return len(self.priority_queue_list)

def insert(self, node):
# if queue is empty
if self.size() == 0:
self.priority_queue_list.append(node)
else:
# traverse the queue to find the right place for new node
for index, current in enumerate(self.priority_queue_list):
if current.priority < node.priority:
# if we have traversed the complete queue
if index == self.size() - 1:
# add new node at the end
self.priority_queue_list.insert(index + 1, node)
else:
continue
else:
self.priority_queue_list.insert(index, node)
return True
def push(self, item, priority=None):
priority = item if priority is None else priority
node = PriorityQueueNode(item, priority)
for index, current in enumerate(self.priority_queue_list):
if current.priority > node.priority:
self.priority_queue_list.insert(index, node)
return
# when traversed complete queue
self.priority_queue_list.append(node)

def delete(self):
# remove the first node from the queue
return self.priority_queue_list.pop(0)

def pop(self):
# remove and return the first node from the queue
return self.priority_queue_list.popleft()

0 comments on commit b4cbaa4

Please sign in to comment.