Skip to content

Instantly share code, notes, and snippets.

@aajjbb
Created September 6, 2016 03:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aajjbb/f08a9c96a9dcc9aeeb742df6b0435c50 to your computer and use it in GitHub Desktop.
Save aajjbb/f08a9c96a9dcc9aeeb742df6b0435c50 to your computer and use it in GitHub Desktop.
dynamic median
//Get median of a sequence in O(log(n))
void balance() {
while (abs((int) (minHeap.size() - maxHeap.size())) > 1) {
if (minHeap.size() > maxHeap.size()) {
int tmp = minHeap.top();
minHeap.pop();
maxHeap.push(tmp);
} else {
int tmp = maxHeap.top();
maxHeap.pop();
minHeap.push(tmp);
}
}
}
int median_retrieve(void) {
if (minHeap.empty() && maxHeap.empty()) return 0;
if (minHeap.size() == maxHeap.size()) {
return min(minHeap.top(), maxHeap.top());
} else {
if (minHeap.size() > maxHeap.size()) {
return minHeap.top();
} else {
return maxHeap.top();
}
}
}
void median_insert(int x) {
if (x > median_retrieve()) {
minHeap.push(x);
} else {
maxHeap.push(x);
}
balance();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment