c++ - 高效的中值计算

标签 c++ std median nth-element

我有一个长度为 n 的数组 A。假设 B 是一个包含 A 的第 k 个元素的数组(我们永远不想单独存储 - 这只是为了帮助解释)。我想找到 B 的中位数,我想将 A 的那个元素移动到A中第(n/2)层的位置。

我怎样才能有效地做到这一点?我正在考虑尝试对 std::nth_element 进行一次调用,将指针传递给 A。但是,我需要此指针递增 A 的 k 个元素。我该怎么做?本质上:

A2 = (kFloat *)A;
std::nth_element(A2, A2 + (n/k)/2, A2 + (n/k));
swap(A[ ((n/k)/2)*k ], A[n/2]); // This might be redundant

其中 kFloat 是一个结构,其作用类似于 float ,但当您增加指针时,它会在内存中移动 k*sizeof(float)。

注意:我不需要真正的中位数(当 n 为偶数时中间两个的平均值)。

编辑:另一种表达我想要的方式(不编译,因为 k 不是常量):

std::nth_element((float[k] * )A, ((float[k] * ) A)[(n / k) / 2], ((float[k] * ) A)[n / k]);

编辑 2: 我正在更改 algorithm.cc,所以我不想引入对像 Boost 这样的库的依赖。我只想使用核心 C++11 功能 + std。

最佳答案

我已经在自定义迭代器上实现了一次二分搜索 - 你可以在 https://gist.github.com/IvanVergiliev/6048716 查看它.它针对的是一个特定的问题,但总体思路是相同的:在您的序列上编写一个迭代器类并实现所需的运算符(++、--、+=)以一次移动 k 个位置。

关于c++ - 高效的中值计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20588252/

相关文章:

r - 如何使用 ggplot 函数制作连续平滑的中位数?

algorithm - O(n) 算法找到 n² 隐式数字的中位数

MySQL:计算派生值的中位数

c++ - 需要从png文件中读取数据并将其保存到新文件中,如何? C++

c++ - C++中通过函数调用创建对象

c++ - g++ 坚持使用 std::string 而不是 string

c++ - 如何结合使用 std::bind 和 std::shared_ptr

C++:用二维 C 数组构造 std::vector<std::vector<int>> ?

c++ - 是否有 ranges::view::transform 的可修改 View 版本?

c++ - 什么是用于索引访问的良好未定义大小数据结构?