示例#1
0
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())
示例#3
0
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)