@@ 85-163 (lines=79) @@ | ||
82 | def create(): |
|
83 | return MinPQ() |
|
84 | ||
85 | ||
86 | class MaxPQ(object): |
|
87 | pq = None |
|
88 | N = 0 |
|
89 | ||
90 | def __init__(self, capacity=None): |
|
91 | if capacity is None: |
|
92 | capacity = 10 |
|
93 | self.pq = [0] * capacity |
|
94 | ||
95 | def enqueue(self, key): |
|
96 | if self.N == len(self.pq): |
|
97 | self.resize(len(self.pq) * 2) |
|
98 | self.N += 1 |
|
99 | self.pq[self.N] = key |
|
100 | self.swim(self.N) |
|
101 | ||
102 | def swim(self, k): |
|
103 | while k > 1: |
|
104 | parent = k // 2 |
|
105 | if greater(self.pq[k], self.pq[parent]): |
|
106 | exchange(self.pq, k, parent) |
|
107 | k = parent |
|
108 | else: |
|
109 | break |
|
110 | ||
111 | def del_max(self): |
|
112 | if self.is_empty(): |
|
113 | return None |
|
114 | ||
115 | key = self.pq[1] |
|
116 | exchange(self.pq, 1, self.N) |
|
117 | self.N -= 1 |
|
118 | if self.N == len(self.pq) // 4: |
|
119 | self.resize(len(self.pq) // 2) |
|
120 | ||
121 | self.sink(self.pq, 1, self.N) |
|
122 | return key |
|
123 | ||
124 | @staticmethod |
|
125 | def sink(tmp, k, n): |
|
126 | ||
127 | while k * 2 <= n: |
|
128 | child = k * 2 |
|
129 | if child < n and greater(tmp[child + 1], tmp[child]): |
|
130 | child = child + 1 |
|
131 | if greater(tmp[child], tmp[k]): |
|
132 | exchange(tmp, child, k) |
|
133 | k = child |
|
134 | else: |
|
135 | break |
|
136 | ||
137 | def resize(self, new_size): |
|
138 | tmp = [0] * new_size |
|
139 | for k in range(min(new_size, len(self.pq))): |
|
140 | tmp[k] = self.pq[k] |
|
141 | self.pq = tmp |
|
142 | ||
143 | def is_empty(self): |
|
144 | return self.N == 0 |
|
145 | ||
146 | def size(self): |
|
147 | return self.N |
|
148 | ||
149 | def iterate(self): |
|
150 | tmp = [0] * (self.N + 1) |
|
151 | for k in range(self.N + 1): |
|
152 | tmp[k] = self.pq[k] |
|
153 | ||
154 | n = self.N |
|
155 | while n >= 1: |
|
156 | key = tmp[1] |
|
157 | exchange(tmp, 1, n) |
|
158 | n -= 1 |
|
159 | self.sink(tmp, 1, n) |
|
160 | yield key |
|
161 | ||
162 | @staticmethod |
|
163 | def create(): |
|
164 | return MaxPQ() |
|
165 | ||
166 | ||
@@ 4-82 (lines=79) @@ | ||
1 | from pyalgs.algorithms.commons.util import less, exchange, greater |
|
2 | ||
3 | ||
4 | class MinPQ(object): |
|
5 | pq = None |
|
6 | N = 0 |
|
7 | ||
8 | def __init__(self, capacity=None): |
|
9 | if capacity is None: |
|
10 | capacity = 10 |
|
11 | self.pq = [0] * capacity |
|
12 | ||
13 | def enqueue(self, key): |
|
14 | self.N += 1 |
|
15 | if self.N == len(self.pq): |
|
16 | self.resize(len(self.pq) * 2) |
|
17 | ||
18 | self.pq[self.N] = key |
|
19 | self.swim(self.N) |
|
20 | ||
21 | def swim(self, k): |
|
22 | while k > 1: |
|
23 | parent = k // 2 |
|
24 | if less(self.pq[k], self.pq[parent]): |
|
25 | exchange(self.pq, k, parent) |
|
26 | k = parent |
|
27 | else: |
|
28 | break |
|
29 | ||
30 | def del_min(self): |
|
31 | if self.is_empty(): |
|
32 | return None |
|
33 | ||
34 | key = self.pq[1] |
|
35 | exchange(self.pq, 1, self.N) |
|
36 | self.N -= 1 |
|
37 | if self.N == len(self.pq) // 4: |
|
38 | self.resize(len(self.pq) // 2) |
|
39 | ||
40 | self.sink(self.pq, 1, self.N) |
|
41 | return key |
|
42 | ||
43 | @staticmethod |
|
44 | def sink(tmp, k, n): |
|
45 | ||
46 | while k * 2 <= n: |
|
47 | child = k * 2 |
|
48 | if child < n and less(tmp[child + 1], tmp[child]): |
|
49 | child = child + 1 |
|
50 | if less(tmp[child], tmp[k]): |
|
51 | exchange(tmp, child, k) |
|
52 | k = child |
|
53 | else: |
|
54 | break |
|
55 | ||
56 | def resize(self, new_size): |
|
57 | tmp = [0] * new_size |
|
58 | for k in range(min(new_size, len(self.pq))): |
|
59 | tmp[k] = self.pq[k] |
|
60 | self.pq = tmp |
|
61 | ||
62 | def is_empty(self): |
|
63 | return self.N == 0 |
|
64 | ||
65 | def size(self): |
|
66 | return self.N |
|
67 | ||
68 | def iterate(self): |
|
69 | tmp = [0] * (self.N + 1) |
|
70 | for k in range(self.N + 1): |
|
71 | tmp[k] = self.pq[k] |
|
72 | ||
73 | n = self.N |
|
74 | while n >= 1: |
|
75 | key = tmp[1] |
|
76 | exchange(tmp, 1, n) |
|
77 | n -= 1 |
|
78 | self.sink(tmp, 1, n) |
|
79 | yield key |
|
80 | ||
81 | @staticmethod |
|
82 | def create(): |
|
83 | return MinPQ() |
|
84 | ||
85 |