image.png

    1. Solution I:数组+Quick Select 添加时间复杂度O(1),查找时间复杂度O(n)
    2. Solution II: 数组+插排 添加时间复杂度O(n),查找时间复杂度O(1)
    3. Solution III:链表+插排 添加时间复杂度O(n),查找时间复杂度O(1)
    4. Solution IV: 大堆小堆法 添加时间复杂度O(logN),查找时间复杂度O(1)

    大堆小堆策略:
    image.png
    3.当已有偶数个数据时放入小堆,奇数个则放入大堆,数据总量为奇数时返回小堆堆顶,为偶数时返回大堆顶和小堆顶的平均数。

    1. template<typename T>
    2. class DynamicMiddleNum {
    3. public:
    4. void add(T num) {
    5. int size = min.size() + max.size();
    6. if (size & 1 == 0) {
    7. if (max.size() > 0 && num < max[0]) {
    8. max.push_back(num);
    9. push_heap(max.begin(), max.end(), less<T>());
    10. num = max[0];
    11. pop_heap(max.begin(), max.end(), less<T>());
    12. max.pop_back();
    13. }
    14. min.push_back(num);
    15. push_heap(min.begin(), min.end(), greater<T>());
    16. }else {
    17. if (min.size() > 0 && num > min[0]) {
    18. min.push_back(num);
    19. push_heap(min.begin(), min.end(), greater<T>());
    20. num = min[0];
    21. pop_heap(min.begin(), min.end(), greater<T>());
    22. min.pop_back();
    23. }
    24. max.push_back(num);
    25. push_heap(max.begin(), max.end(), less<T>());
    26. }
    27. size++;
    28. }
    29. T getMidNum() {
    30. int size = min.size() + max.size();
    31. assert(size > 0);
    32. if (size & 1)
    33. return min[0];
    34. else
    35. return (max[0] + min[0]) / 2;
    36. }
    37. private:
    38. vector<T> min;
    39. vector<T> max;
    40. };