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

📅  最后修改于: 2023-12-03 14:49:47.001000             🧑  作者: Mango

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

介绍

中位数是一组数据的中间位置的值,即在这组数据中,有一半的数据小于该值,有一半的数据大于该值。在计算机科学中,我们经常需要对实时或流式数据流进行中位数计算。本文将介绍如何使用STL算法来计算运行整数流的中位数。

解决方案
解决方案一:插入排序

插入排序是一种简单的排序算法,它可以直接应用于整数流计算中位数。当然,我们可以通过STL实现它。

void insert_sort(vector<int>& seq) {
    for (int i = 1; i < seq.size(); i++) {
        int temp = seq[i];
        int j = i - 1;
        while (j >= 0 && seq[j] > temp) {
            seq[j + 1] = seq[j];
            j--;
        }
        seq[j + 1] = temp;
    }
}

int median(vector<int>& seq) {
    insert_sort(seq);
    int n = seq.size();
    return (n % 2 == 0) ? (seq[n / 2 - 1] + seq[n / 2]) / 2 : seq[n / 2];
}

上述代码使用了insert_sort函数对整数流排序,并计算中位数。

解决方案二:multiset容器

multiset是基于红黑树实现的数据结构,能够自动排序并支持重复元素。因此,它也适用于运行整数流计算中位数。

int median(vector<int>& seq) {
    multiset<int> s;
    for (int x : seq) {
        s.insert(x);
        if (s.size() > seq.size() / 2)
            s.erase(s.begin());
    }
    return (*s.begin() + *prev(s.end(), (seq.size() % 2 == 0))) / 2;
}

上述代码使用multiset容器来实现插入和删除,并计算中位数。

总结

本文介绍了两种使用STL来计算运行整数流的中位数的方案。我们可以根据数据集的大小和程序的实时性来选择解决方案。