def test_min(self): mh = MinHeap() with self.assertRaises(IndexError): mh.min() mh.append(1) self.assertEqual(1, mh.min()) self.assertEqual(1, mh.min()) mh.append(1) self.assertEqual(1, mh.min()) mh.pop() self.assertEqual(1, mh.min()) mh.pop() with self.assertRaises(IndexError): mh.min() mh.append(3) self.assertEqual(3, mh.min()) mh.append(1) self.assertEqual(1, mh.min()) mh.pop() self.assertEqual(3, mh.min())
class Median: def __init__(self): self.h_low = MaxHeap() self.h_high = MinHeap() def add_element(self, value): if self.h_low.heap_size == 0 or value < self.h_low.max(): self.h_low.insert(value) if self.h_low.heap_size - self.h_high.heap_size > 1: self.h_high.insert(self.h_low.extract_max()) else: self.h_high.insert(value) if self.h_high.heap_size - self.h_low.heap_size > 1: self.h_low.insert(self.h_high.extract_min()) def get_median(self): if (self.h_low.heap_size + self.h_high.heap_size) % 2 == 0: return self.h_low.max(), self.h_high.min() else: if self.h_low.heap_size > self.h_high.heap_size: return self.h_low.max() else: return self.h_high.min() def get_maxheap_elements(self): return self.h_low.heap def get_minheap_elements(self): return self.h_high.heap
def dijkstra(graph, root): vertices = graph.keys() n = len(vertices) # Initialize the priority queue inf = float("inf") pq = MinHeap([(v, inf) for v in graph.keys()]) pq.change_priority(root, 0) # Other initializations parent = collections.defaultdict(lambda: None) selected = set() cost = collections.defaultdict(lambda: inf) cost[root] = 0 while len(selected) < n: u = pq.min() du = cost[u] = pq.get_priority(u) selected.add(u) pq.take_min() for (v, w) in graph[u].items(): if v not in selected and pq.get_priority(v) > du + w: pq.change_priority(v, du + w) parent[v] = u return cost, parent