Advertisement
Guest User

Untitled

a guest
Nov 25th, 2015
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. #ifndef MEDIAN_KEEPER_HPP
  2. #define MEDIAN_KEEPER_HPP
  3.  
  4. #include <queue>
  5. #include <vector>
  6.  
  7. template<typename T>
  8. class MedianKeeper
  9. {
  10. public:
  11.  
  12. MedianKeeper() = default;
  13.  
  14. MedianKeeper(std::initializer_list<T> list)
  15. {
  16. for (const auto& item : list) push(item);
  17. }
  18.  
  19. void push(const T& item)
  20. {
  21. if (seen() > 0 && item > _median)
  22. {
  23. _right.push(item);
  24.  
  25. if (_right.size() == _left.size() + 2)
  26. {
  27. _left.push(_right.top());
  28.  
  29. _right.pop();
  30. }
  31. }
  32.  
  33. else
  34. {
  35. _left.push(item);
  36.  
  37. if (_left.size() == _right.size() + 2)
  38. {
  39. _right.push(_left.top());
  40.  
  41. _left.pop();
  42. }
  43. }
  44.  
  45. _median = _compute();
  46. }
  47.  
  48. T& operator()()
  49. {
  50. return median();
  51. }
  52.  
  53. const T& operator()() const
  54. {
  55. return median();
  56. }
  57.  
  58. T& median()
  59. {
  60. if (is_empty())
  61. {
  62. throw std::out_of_range("No values inserted yet!s");
  63. }
  64.  
  65. return _median;
  66. }
  67.  
  68. const T& median() const
  69. {
  70. if (is_empty())
  71. {
  72. throw std::out_of_range("No values inserted yet!s");
  73. }
  74.  
  75. return _median;
  76. }
  77.  
  78.  
  79. T pop()
  80. {
  81. auto old = _median;
  82.  
  83. if (seen() % 2 == 0)
  84. {
  85. _left.pop();
  86. _right.pop();
  87. }
  88.  
  89. else if (_left.size() > _right.size()) _left.pop();
  90.  
  91. else _right.pop();
  92.  
  93. _median = _compute();
  94.  
  95. return old;
  96. }
  97.  
  98. void clear()
  99. {
  100. _left.clear();
  101. _right.clear();
  102. }
  103.  
  104.  
  105. size_t seen() const
  106. {
  107. return _left.size() + _right.size();
  108. }
  109.  
  110. bool is_empty() const
  111. {
  112. return seen() == 0;
  113. }
  114.  
  115. private:
  116.  
  117. T _compute()
  118. {
  119. if (seen() % 2 == 0)
  120. {
  121. return (_left.top() + _right.top()) / 2;
  122. }
  123.  
  124. else if (_left.size() > _right.size()) return _left.top();
  125.  
  126. else return _right.top();
  127. }
  128.  
  129. std::priority_queue<T> _left;
  130.  
  131. std::priority_queue<T, std::vector<int>, std::greater<T>> _right;
  132.  
  133. T _median;
  134. };
  135.  
  136. #endif /* MEDIAN_KEEPER_HPP */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement