std :: multiset并找到中间元素

Avi*_*ash 5 c++ stl

我有std::multiset哪个如果我迭代std::multiset::begin()std::multiset::end()我将获得排序元素.如何获取中间元素在此std::multiset除了从迭代std::multiset::begin()std::multiset::begin() + size() / 2

Ser*_*gey 9

这是获得std :: multiset中值的解决方案:

template<class T>
double GetMedian(const std::multiset<T>& data)
{
    if (data.empty())
        throw std::length_error("Cannot calculate median value for empty dataset");

    const size_t n = data.size();
    double median = 0;

    auto iter = data.cbegin();
    std::advance(iter, n / 2);

    // Middle or average of two middle values
    if (n % 2 == 0)
    {
        const auto iter2 = iter--;
        median = double(*iter + *iter2) / 2;    // data[n/2 - 1] AND data[n/2]
    }
    else
    {
        median = *iter;
    }

    return median;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要中位数绝对偏差(mdev),例如:

template<class T>
double GetMedianAbsoluteDeviation(const std::multiset<T>& data)
{
    const double fMedian = GetMedian(data);
    std::multiset<double> diff;
    for (const auto& x : data)
    {
        diff.insert(std::abs(fMedian - x));
    }
    return GetMedian(diff);
}
Run Code Online (Sandbox Code Playgroud)

  • 这与 iter++ 有什么不同?这并不能解决在不迭代集合中每个元素的情况下获取中位数的运行时问题。我刚刚为多重集包装器写了一篇博客文章,它通过 O(1) 访问中值来解决这个问题。请参阅 https://medium.com/programming-in-the-wild/log-n-sorted-container-in-c-22446b64e2bc (3认同)