-
Notifications
You must be signed in to change notification settings - Fork 116
/
Copy pathfind_median_from_data_stream.cpp
103 lines (97 loc) · 2.11 KB
/
find_median_from_data_stream.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <vector>
#include <iostream>
#include <priority_queue>
#include <functional>
using namespace std;
class Heap {
private:
vector<int> array;
int (*compare) (int, int);
void adjust(int idx) {
int largest = idx;
if (2*idx+1 < array.size() && compare(array[2*idx+1], array[idx]))
largest = 2*idx+1;
if (2*idx+2 < array.size() && compare(array[2*idx+2],array[largest]))
largest = 2*idx+2;
if (largest != idx) {
int tmp = array[idx];
array[idx] = array[largest];
array[largest] = tmp;
adjust(largest);
}
return;
}
public:
Heap(int (*compare) (int, int)): compare(compare) {}
void push(int val) {
array.push_back(val);
for (int i = array.size()/2 - 1; i >= 0; --i){
adjust(i);
}
}
void print() {
for (auto val: array)
cout << "print\t" << val << endl;
}
int pop() {
int ret = array[0];
array[0] = array.back();
array.pop_back();
adjust(0);
return ret;
}
int empty() {
return array.empty();
}
int size() {
return array.size();
}
int top() {
return array[0];
}
};
int max(int i, int j) {
if (i > j) return true;
return false;
}
int min(int i, int j) {
if (i < j) return true;
return false;
}
class MedianFinder {
priority_queue<int> max_heap;
priority_queue<int, vector<int>, greater<int>> min_heap;
public:
// Adds a number into the data structure.
void addNum(int num) {
if (max_heap.empty() || num <= max_heap.top()) {
max_heap.push(num);
}else {
min_heap.push(num);
}
if (max_heap.size() > min_heap.size()+1){
int top = max_heap.top();
max_heap.pop();
min_heap.push(top);
}
if (min_heap.size() > max_heap.size()) {
int top = min_heap.top();
min_heap.pop();
max_heap.push(top);
}
return;
}
// Returns the median of current data stream
double findMedian() {
return max_heap.size() == min_heap.size() ? (max_heap.top()+min_heap.top())/2.0 : max_heap.top();
}
};
int main() {
MedianFinder finder;
finder.addNum(-1);
finder.addNum(-2);
finder.addNum(-3);
finder.addNum(-4);
finder.addNum(-5);
return 0;
}