📅  最后修改于: 2023-12-03 15:22:16.980000             🧑  作者: Mango
在编程工作中,经常会遇到需要对数据流中的数字进行中位数计算的需求。使用 STL(标准模板库)可以帮助我们更方便地实现这一任务。
中位数是一个有序数组的中间值,即一半的数字小于它,一半的数字大于它。如果数组长度为偶数,中位数定义为两个中间数字的平均值。在本文中,我们将介绍如何使用 STL 在运行整数流时计算中位数。
在 C++ 中,我们可以使用 cin 或者文件输入流来读取整数流。如果我们想要在连续读入整数的同时计算中位数,可以使用 STL 内置的堆(heap)来实现。
代码示例:
#include <iostream>
#include <queue>
#include <functional>
using namespace std;
int main() {
int num;
priority_queue<int, vector<int>, greater<int>> minHeap; // 最小堆
priority_queue<int, vector<int>, less<int>> maxHeap; // 最大堆
while (cin >> num) {
if (maxHeap.size() == 0 || num < maxHeap.top()) {
maxHeap.push(num);
} else {
minHeap.push(num);
}
if (minHeap.size() > maxHeap.size()) {
maxHeap.push(minHeap.top());
minHeap.pop();
} else if (maxHeap.size() - minHeap.size() > 1) {
minHeap.push(maxHeap.top());
maxHeap.pop();
}
if (maxHeap.size() == minHeap.size()) {
cout << (maxHeap.top() + minHeap.top()) / 2.0 << endl; // 输出中位数
} else {
cout << maxHeap.top() << endl; // 输出中位数
}
}
return 0;
}
在本文中,我们介绍了如何使用 STL 中的堆和比较函数对象,实现对整数流的中位数计算。这种方法具有较好的时间和空间复杂度,可以满足大多数实际应用场景的需求。