maxheap: for numbers < median minheap: for numbers > median maxheap has at most 1 element more than minheap
process-stream(stream): // maxheap (+1), minheap maxheap = new // for numbers < median minheap = new // for numbers > median foreach x in stream: if maxheap.count() > minheap.count(): if x >= maxheap.top(): minheap.insert(x) else: top = maxheap.displace(x) minheap.insert(top) else: // maxheap.count() == minheap.count() if maxheap.isempty() || x <= minheap.top(): maxheap.insert(x) else: top = minheap.displace(x) maxheap.insert(top) // interface heap: x top(): insert(x): // return top, replace top with x and heapify x displace(x): //avoids delete() and insert(x), O(logn) get-median(): if maxheap().isempty(): throw if maxheap.count() > minheap.count(): return maxheap.top() else: // maxheap.size() == minheap.size() return (maxheap.top() + minheap.top()) /2time: O(nlogn)
space: O(n)
[Hat tip to ctci]
No comments:
Post a Comment