从向量中提取最小值、最大值和中位数的最有效方法是什么
What's the most efficient way to extract min, max & median from a vector
给定一个vector<T> vec{...}
假设T是其中一种数值类型,提取其最小值,最大值和中位数的最佳方法是什么?我知道std::nth_element
和std::minmax_element
,但如果一个接一个地调用它们,它们似乎会做多余的工作。
到目前为止,我想出的最好的主意是一次接一个地调用 std::nth_element 3 次。但这仍然需要 3N 比较,对吧?有没有办法重用在以前的迭代中完成的部分排序?
使用 std::nth_element
进行分区,产生中位数,然后在左半部分std::min_element
,在右半部分std::max_element
。
如果您需要它比这更快,请根据std::nth_element
滚动您自己的版本。
另一种选择是为 std::nth_element
指定自定义比较,以捕获最小值和最大值。 它最终可能会进行更多的比较和分支,因此在某些特定硬件上这可能会变慢,可能取决于缓存了多少数据等,因此 - 一如既往 - 如果您有理由关心基准测试,但对于非空vector
a
,该技术如下所示:
int min = a[0], max = a[0];
std::nth_element(a.begin(), a.begin() + n, a.end(),
[&](int lhs, int rhs) {
min = std::min(min, std::min(lhs, rhs));
max = std::max(max, std::max(lhs, rhs));
return lhs < rhs;
});
对于它的价值不大,在我的(~10yo i5-660(HTPC 上使用 GCC 7.4,在 0 到 1000 之间有 100 万个随机int
,nth_element
最小/最大比较比没有大约 36% 的时间长。
相关文章:
- 为什么是0;C++中的有效语句
- 我如何知道作为参数的size_t在函数中是否有效?
- 点云库在VS 2019中不起作用,但在VS 2017中确实有效
- 模板变量是否允许在多个翻译单元中并有效合并?
- 在 1.5 秒内找到 3 到 4 个不同整数的中位数超过 2000 万
- 如何知道文本文件中的输入是否是 C++ 中的有效数字
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 将__m256的奇怪元素提取到__m128中的有效(在锐龙上)方法?
- 在递归函数中更有效地创建对象和对象数组?C++
- 如何检查给定文件是否是C++中的有效视频文件?
- 十进制的中位数是多少?
- 在C++中更有效地分配结构体的内存
- 涡轮增压 这个声明“int fun-name(static int)”在C++中是否有效,为什么
- 如何使用第一个、中间和最后一个元素的中位数正确分区?
- 小写 null 在 C++ 中是否有效
- 使用 boost::累加器::统计来查找数组的中位数
- 从向量中提取最小值、最大值和中位数的最有效方法是什么
- 如果方法是常量,如何找到向量的中位数?
- 在排序字符串向量中进行有效搜索
- 在C++中实现两个大小相等的排序数组的中位数