Skip to content

Commit 1ac287f

Browse files
goswami-rahulHai Hoang Dang
authored andcommitted
refactor PriorityQueue and tests (keon#348)
1 parent 3d1956d commit 1ac287f

2 files changed

Lines changed: 63 additions & 47 deletions

File tree

algorithms/queues/priority_queue.py

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,54 @@
33
Insertion - O(n)
44
Extract min/max Node - O(1)
55
"""
6-
import collections
6+
import itertools
77

88

99
class PriorityQueueNode:
10-
def __init__(self, data, priority):
11-
self.data = data
12-
self.priority = priority
10+
def __init__(self, data, priority):
11+
self.data = data
12+
self.priority = priority
13+
14+
def __repr__(self):
15+
return "{}: {}".format(self.data, self.priority)
1316

14-
def __repr__(self):
15-
return str(self.data) + ": " + str(self.priority)
1617

1718
class PriorityQueue:
18-
def __init__(self):
19-
self.priority_queue_list = collections.deque()
20-
21-
def __repr__(self):
22-
return "PriorityQueue({!r})".format(list(self.priority_queue_list))
23-
24-
def size(self):
25-
return len(self.priority_queue_list)
26-
27-
def push(self, item, priority=None):
28-
priority = item if priority is None else priority
29-
node = PriorityQueueNode(item, priority)
30-
for index, current in enumerate(self.priority_queue_list):
31-
if current.priority > node.priority:
32-
self.priority_queue_list.insert(index, node)
33-
return
34-
# when traversed complete queue
35-
self.priority_queue_list.append(node)
36-
37-
def pop(self):
38-
# remove and return the first node from the queue
39-
return self.priority_queue_list.popleft()
19+
def __init__(self, items=None, priorities=None):
20+
"""Create a priority queue with items (list or iterable).
21+
If items is not passed, create empty priority queue."""
22+
self.priority_queue_list = []
23+
if items is None:
24+
return
25+
if priorities is None:
26+
priorities = itertools.repeat(None)
27+
for item, priority in zip(items, priorities):
28+
self.push(item, priority=priority)
29+
30+
def __repr__(self):
31+
return "PriorityQueue({!r})".format(self.priority_queue_list)
32+
33+
def size(self):
34+
"""Return size of the priority queue.
35+
"""
36+
return len(self.priority_queue_list)
37+
38+
def push(self, item, priority=None):
39+
"""Push the item in the priority queue.
40+
if priority is not given, priority is set to the value of item.
41+
"""
42+
priority = item if priority is None else priority
43+
node = PriorityQueueNode(item, priority)
44+
for index, current in enumerate(self.priority_queue_list):
45+
if current.priority < node.priority:
46+
self.priority_queue_list.insert(index, node)
47+
return
48+
# when traversed complete queue
49+
self.priority_queue_list.append(node)
50+
51+
def pop(self):
52+
"""Remove and return the item with the lowest priority.
53+
"""
54+
# remove and return the first node from the queue
55+
return self.priority_queue_list.pop().data
56+

tests/test_queues.py

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import unittest
2+
13
from algorithms.queues import (
24
ArrayQueue, LinkedListQueue,
35
max_sliding_window,
46
reconstruct_queue,
5-
PriorityQueue, PriorityQueueNode
7+
PriorityQueue
68
)
79

8-
import unittest
910

1011
class TestQueue(unittest.TestCase):
1112
"""
@@ -70,10 +71,9 @@ def test_LinkedListQueue(self):
7071

7172
self.assertTrue(queue.is_empty())
7273

73-
class TestSuite(unittest.TestCase):
7474

75+
class TestSuite(unittest.TestCase):
7576
def test_max_sliding_window(self):
76-
7777
array = [1, 3, -1, -3, 5, 3, 6, 7]
7878
self.assertEqual(max_sliding_window(array, k=5), [5, 5, 6, 7])
7979
self.assertEqual(max_sliding_window(array, k=3), [3, 3, 5, 5, 6, 7])
@@ -85,24 +85,23 @@ def test_max_sliding_window(self):
8585
self.assertEqual(max_sliding_window(array, k=2), [8, 10, 10, 9, 9, 15, 15, 90, 90])
8686

8787
def test_reconstruct_queue(self):
88-
self.assertEqual([[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]],
89-
reconstruct_queue([[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]))
88+
self.assertEqual([[5, 0], [7, 0], [5, 2], [6, 1], [4, 4], [7, 1]],
89+
reconstruct_queue([[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]]))
9090

91-
"""
92-
TODO: Refactor PriorityQueue because insert method does not work for python3.4
93-
class TestPriorityQueue(unittest.TestCase):
9491

95-
Test suite for the PriorityQueue data structures.
92+
class TestPriorityQueue(unittest.TestCase):
93+
"""Test suite for the PriorityQueue data structures.
94+
"""
9695

9796
def test_PriorityQueue(self):
98-
queue = PriorityQueue()
99-
queue.push(3)
100-
queue.push(4)
101-
queue.push(1)
102-
queue.push(6)
103-
self.assertEqual(4,queue.size())
104-
self.assertEqual(str(1) + ": " + str(1),str(queue.pop()))
105-
"""
106-
if __name__ == "__main__":
97+
queue = PriorityQueue([3, 4, 1, 6])
98+
self.assertEqual(4, queue.size())
99+
self.assertEqual(1, queue.pop())
100+
self.assertEqual(3, queue.size())
101+
queue.push(2)
102+
self.assertEqual(4, queue.size())
103+
self.assertEqual(2, queue.pop())
104+
107105

106+
if __name__ == "__main__":
108107
unittest.main()

0 commit comments

Comments
 (0)