class RunningMedian: def __init__(self): self.left_max_heap = MaxHeap() self.right_min_heap = MinHeap() def stream_element(self, a): left_len, right_len = self.left_max_heap.get_length( ), self.right_min_heap.get_length() if left_len == right_len: self.left_max_heap.push(a) return if left_len > right_len: peek = self.left_max_heap.peek() if a >= peek: self.right_min_heap.push(a) else: popped = self.left_max_heap.pop() self.left_max_heap.push(a) self.right_min_heap.push(popped) return if left_len < right_len: peek = self.right_min_heap.peek() if a <= peek: self.left_max_heap.push(a) else: popped = self.right_min_heap.pop() self.right_min_heap.push(a) self.left_max_heap.push(popped) return def get_current_median(self): left_len, right_len = self.left_max_heap.get_length( ), self.right_min_heap.get_length() if left_len == 0 and right_len == 0: raise ("No element is streamed") if left_len > right_len: median = self.left_max_heap.peek() return median if right_len > left_len: median = self.right_min_heap.peek() return median if left_len == right_len: median = (self.left_max_heap.peek() + self.right_min_heap.peek()) / 2.0 return median
def findMaxK(vals, k): minHeap = MinHeap(k) for n in vals: if minHeap.get_size() < k: minHeap.push(n) elif minHeap.peek() < n: minHeap.pop() minHeap.push(n) while minHeap.get_size() > 0: print(minHeap.pop())
class PriorityQueue(object): def __init__(self): self._heap = MinHeap() self._num_inserted = 0 def _gen_order(self): self._num_inserted += 1 return self._num_inserted def insert(self, prioritized_item): prioritized_item._order = self. _gen_order() self._heap.push(prioritized_item) def pop(self): return self._heap.pop() def peek(self): return self._heap.peek() def __str__(self): s = [] [s.append(str(item)) for item in self._heap._list] return "".join(s)