Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2015
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.92 KB | None | 0 0
  1. #include <queue>
  2. #include <vector>
  3. #include <functional>
  4. #include <limits>
  5. #include <iostream>
  6.  
  7. template<class T>
  8. class RunningMedian {
  9. private:
  10. //Values greater than the median sorted so that smallest is on top
  11. std::priority_queue<T, std::vector<T>, std::greater<T> > upper;
  12. //Values smaller than the median sorted so that greatest is on top
  13. std::priority_queue<T, std::vector<T>, std::less<T> > lower;
  14. T median;
  15. public:
  16. RunningMedian(){
  17. //Seed the queues
  18. upper.push(std::numeric_limits<T>::max());
  19. lower.push (std::numeric_limits<T>::min());
  20. }
  21. void push(T val){
  22. //Add number to the property queue
  23.  
  24. //If number is greater than the least upper number, it is an upper number
  25. if(val>=upper.top())
  26. upper.push(val);
  27. else //Otherwise it is a lower number
  28. lower.push(val);
  29.  
  30. //Rebalance
  31. //If the queues sizes differ by 2, they need to be rebalanced so that they
  32. //differ by 1.
  33. if(upper.size()-lower.size()==2){ //Upper queue is larger
  34. lower.push(upper.top()); //Move value from upper to lower
  35. upper.pop(); //Remove same value from upper
  36. } else if(lower.size()-upper.size()==2){ //Lower queue is larger
  37. upper.push(lower.top()); //Move value from lower to upper
  38. lower.pop(); //Remove same value
  39. }
  40. }
  41.  
  42. T getMedian() const {
  43. if(upper.size()==lower.size()) //Upper and lower are same size
  44. return(upper.top()+lower.top())/((T)2.0); //so median is average of least upper and greatest lower
  45. else if(upper.size()>lower.size()) //Upper size greater
  46. return upper.top();
  47. else //Lower size greater
  48. return lower.top();
  49. }
  50. };
  51.  
  52. int main(){
  53. RunningMedian<int> rm;
  54. rm.push(10);
  55. rm.push(3);
  56. rm.push(1);
  57. rm.push(20);
  58. rm.push(5);
  59. rm.push(8);
  60. rm.push(-1);
  61. std::cout<<rm.getMedian()<<std::endl; //Gives 5
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement