📜  使用STL的运行整数流的中位数|套装2(1)

📅  最后修改于: 2023-12-03 15:22:21.020000             🧑  作者: Mango

使用STL的运行整数流的中位数 | 套装2

本程序使用STL实现了对于输入的整数流的中位数运算。其中使用了两个堆来分别保存输入的整数流的前半段和后半段,并保证前半段中的最大值小于后半段中的最小值。

实现细节

本程序使用了C++ STL中的以下数据结构:

  • priority_queue:用于实现最大堆和最小堆
  • vector:用于存储输入的整数流
  • lower_bound/upper_bound:用于寻找数组元素的位置

具体地,我们使用两个堆,一个最大堆和一个最小堆,分别保存输入的整数流的前半段和后半段。在每次读入一个整数之后,我们需要判断两个堆的大小,将其加入到合适的堆中,并保证前半段中的最大值小于后半段中的最小值。在求解中位数时,我们需要检查两个堆的大小,如果它们的大小相等,则中位数为两个堆顶的平均值,如果前半段比后半段多一个元素,则中位数为前半段中的最大值。

代码示例
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

int main() {
    priority_queue<int, vector<int>, less<int>> left_heap;            // 最大堆
    priority_queue<int, vector<int>, greater<int>> right_heap;         // 最小堆
    vector<int> nums;                                                  // 存储输入流的数组
    int N, i = 0;
    scanf("%d", &N);
    nums.resize(N);

    while (i < N) {
        int x;
        scanf("%d", &x);
        nums[i++] = x;

        if (left_heap.empty() || x <= left_heap.top()) {
            left_heap.push(x);
        } else {
            right_heap.push(x);
        }

        if (left_heap.size() > right_heap.size() + 1) {
            right_heap.push(left_heap.top());
            left_heap.pop();
        } else if (right_heap.size() > left_heap.size()) {
            left_heap.push(right_heap.top());
            right_heap.pop();
        }

        if (i % 2 == 0) {
            printf("%d\n", left_heap.top());
        } else {
            if (left_heap.size() == right_heap.size()) {
                printf("%d\n", (left_heap.top() + right_heap.top()) / 2);
            } else {
                printf("%d\n", left_heap.top());
            }
        }
    }

    return 0;
}

其中,left_heap对应前半段,right_heap对应后半段,实现了对的两个堆的插入、调整和中位数的计算。