C++使用参考计算中位数
C++ calculate median with reference
我尝试计算一个名为 median
的向量的中位数:
std::nth_element(median.begin(), median.begin() + median.size() / 2, median.end());
medianVal = median[median.size() / 2];
cout << "The median is " << medianVal << endl;
这工作正常。但是我需要获取中值在其原始向量中的位置。我怎样才能非常快速地做到这一点?
我假设您不想重新排序原始容器。 如果错了,有更简单的方法。
nth_element
需要一个比较器。
因此,首先在原始容器中创建一个迭代器的向量,然后编写一个比较器,该比较器需要 2 个迭代器,尊重它们,amd 比较结果。
template<class C>
auto median(C const& c){
using std::begin; using std::end;
auto start = begin(c);
auto finish = end(c);
using iterator = decltype(start);
std::vector<iterator> working;
for(auto it = start; it != finish; ++it)
working.push_back(it);
if (working.empty())
return start;
std::nth_element(
begin(working), begin(working) + working.size() / 2, end(working),
[](iterator lhs, iterator rhs){
return *lhs < *rhs;
}
);
return *(begin(working) + working.size() / 2);
}
这确实依赖于一些 C++14(自动返回类型推导),但每个主要编译器(可能除了 icc?)现在都支持它。
它足够灵活,甚至可以在 C 样式数组上运行,我认为它甚至可以与哨兵一起使用。
演示
根据文档 (http://en.cppreference.com/w/cpp/algorithm/nth_element),您使用的函数实际上会部分地对数组进行重新排序。
您需要保留原件的副本并逐步浏览它以找到与中位数匹配的元素。
完成它的另一种方法是有一个元组向量,其中索引简单地存储为元组的第二个成员。当然,您仍然会在某个时候逐步通过矢量。
如果不知道问题的确切性质或所涉及的数据系列中的元素数量,就很难知道"非常快地执行此操作"是什么意思,但是您可能想看看 SO 站点中描述的"堆中位数"又名"滚动中位数"又名"流中位数"算法。
使用此方法,您可以存储当前候选中值的索引,而无需再次迭代原始数据数组以查找中位数的索引。您也不需要修改原始容器的顺序。
相关文章:
- 在计算中使用二的幂有多有利可图
- 在 1.5 秒内找到 3 到 4 个不同整数的中位数超过 2000 万
- 十进制的中位数是多少?
- 如何使用第一个、中间和最后一个元素的中位数正确分区?
- 如何在长时间计算中进行C 的一次进度更新
- 使用 boost::累加器::统计来查找数组的中位数
- 从向量中提取最小值、最大值和中位数的最有效方法是什么
- Q学习计算中的大量状态
- 如何处理计算中的"unsigned long long int"?
- 我可以在Apache Ignite计算中混合使用C++和Java吗?
- 如果方法是常量,如何找到向量的中位数?
- 多线程蒙特卡罗计算中没有加速
- 在C++中实现两个大小相等的排序数组的中位数
- 可以在CUDA速度计算中实现TensorFlow自定义OP梯度
- 查找一组循环数据的中位数
- 为什么我的中位数快速选择算法segfault
- 是否可以实施中位数的中位数intreselect而没有掉期或堆的分配
- 如何在 c++ 中计算整数位数
- C++使用参考计算中位数
- 加权中位数计算