Skip to content

Commit aea0852

Browse files
committed
update to priority queue
1 parent 8b41bfd commit aea0852

File tree

1 file changed

+52
-60
lines changed

1 file changed

+52
-60
lines changed

priority_queue.py

Lines changed: 52 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,39 @@
1-
def swap(A, i, j):
2-
tmp = A[i]
3-
A[i] = A[j]
4-
A[j] = tmp
1+
class PriorityQueue:
2+
def __init__(self, less):
3+
self.heap = Heap([], less, update_position)
4+
self.get_key_and_pos = {}
55

6-
def less(x, y):
7-
return x < y
6+
def __repr__(self):
7+
return repr(self.heap)
88

9-
def less_key(x, y):
10-
return x.key < y.key
9+
def push(self, key):
10+
kp = KeyWithPosition(key)
11+
self.get_key_and_pos[key] = kp
12+
self.heap.insert(kp)
1113

12-
def update_position(obj, pos):
13-
obj.position = pos
14+
def pop(self):
15+
return self.heap.extract_max().key
1416

15-
def get_position(obj):
16-
return obj.position
17+
def increase_key(self, key):
18+
obj = self.get_key_and_pos[key]
19+
heap_increase_key(self.heap, obj.position)
1720

18-
def ignore_update(obj, pos):
19-
pass
21+
def empty(self):
22+
return self.heap.heap_size == 0
23+
24+
class KeyWithPosition:
25+
def __init__(self, k):
26+
self.key = k
27+
self.position = -1
28+
29+
def __repr__(self):
30+
return str(self.key) + '@' + repr(self.position)
31+
32+
def update_position(key_with_pos, pos):
33+
key_with_pos.position = pos
2034

2135
class Heap:
22-
def __init__(self, data,
23-
less = less,
24-
update = ignore_update):
36+
def __init__(self, data, less, update):
2537
self.data = data
2638
self.less = less
2739
self.update = update
@@ -64,6 +76,11 @@ def right(i):
6476
def parent(i):
6577
return (i-1) // 2
6678

79+
def swap(A, i, j):
80+
tmp = A[i]
81+
A[i] = A[j]
82+
A[j] = tmp
83+
6784
def heap_increase_key(H, i):
6885
while i > 0 and H.less(H.data[parent(i)], H.data[i]):
6986
swap(H.data, i, parent(i))
@@ -100,73 +117,48 @@ def heap_sort(H):
100117
H.heap_size -= 1
101118
max_heapify(H, 0)
102119

103-
class PriorityQueue:
104-
def __init__(self, less=less_key, update=update_position, get=get_position):
105-
self.heap = Heap([], less=less, update=update)
106-
self.get_position = get
107-
self.get_object = {}
108-
109-
def __repr__(self):
110-
return repr(self.heap)
111-
112-
def push(self, key):
113-
o = Obj(key)
114-
self.get_object[key] = o
115-
self.heap.insert(o)
116-
117-
def pop(self):
118-
return self.heap.extract_max().key
119-
120-
def increase_key(self, key):
121-
obj = self.get_object[key]
122-
heap_increase_key(self.heap, self.get_position(obj))
123-
124-
def empty(self):
125-
return self.heap.heap_size == 0
126-
127-
class Obj:
128-
def __init__(self, k):
129-
self.key = k
130-
self.position = -1
120+
def less(x, y):
121+
return x < y
131122

132-
def __repr__(self):
133-
return str(self.key) + '@' + repr(self.position)
123+
def ignore_update(obj, pos):
124+
pass
134125

135126
if __name__ == "__main__":
136-
# test build and extract_max
127+
# test Heap build and extract_max
137128
L = [4,3,5,1,2]
138-
h = Heap(L)
129+
h = Heap(L, less, ignore_update)
139130
for i in range(5, 0, -1):
140131
assert h.extract_max() == i
141132

142-
# test insert
133+
# test Heap insert
143134
L = [4,3,5,1,2]
144135
for k in L:
145136
h.insert(k)
146137
for i in range(5, 0, -1):
147138
assert h.extract_max() == i
148139

149-
# test sort
140+
# test heap_sort
150141
L = [4,3,5,1,2]
151-
heap_sort(Heap(L))
142+
h = Heap(L, less, ignore_update)
143+
heap_sort(h)
152144
for i in range(0, 5):
153145
assert L[i] == i + 1
154146

155-
# Test priority queue
156-
# Q = PriorityQueue()
157-
# for i in range(1, 6):
158-
# Q.push(Obj(i))
159-
# for i in range(5, 0, -1):
160-
# assert Q.pop().key == i
161-
147+
# test PriorityQeueue push and pop
162148
L = {'a': 4, 'b': 3, 'c':5,'d':1,'e':2}
163149
def less(x, y):
164150
return L[x.key] < L[y.key]
165151
Q = PriorityQueue(less)
166152
for k, v in L.items():
167153
Q.push(k)
168-
154+
P = ['c', 'a', 'b', 'e', 'd']
155+
for i in range(0, len(P)):
156+
assert Q.pop() == P[i]
157+
169158
# test increase_key
159+
Q = PriorityQueue(less)
160+
for k, v in L.items():
161+
Q.push(k)
170162
for k, v in L.items():
171163
L[k] = v + 2
172164
Q.increase_key(k)

0 commit comments

Comments
 (0)