- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个算法可以在我的双核 3 GHz Intel 处理器上平均运行 250 毫秒,我正在尝试优化它。目前,我有一个 std::nth_element
在 std::vector
上调用了大约 6,000 次的调用s 在 150 到 300 个元素之间,平均耗时 50 毫秒。我花了一些时间优化我使用的比较器,它目前查找两个 double
s 来自 vector 并执行简单的 <
比较。比较器运行时间的一小部分可以忽略不计 std::nth_element
.比较器的复制构造函数也很简单。
因为这个调用目前占用了我算法 20% 的时间,而且大部分时间花在了 nth_element
的代码上。我没有写(即不是比较器),我想知道是否有人知道优化 nth_element
的方法使用 SIMD 或任何其他方法?我看过some questions关于并行化 std::nth_element
使用 OpenCL 和多线程,但由于 vector 非常短,我不确定我能从这种方法中获得多少好处,尽管我愿意被告知我错了。
如果有 SSE 方法,我可以使用任何 SSE 指令(我认为是当前的)SSE4.2。
谢谢!
最佳答案
两个想法:
多线程可能不会加快任何单个 vector 的处理速度,但可能会随着 vector 数量的增加而有所帮助。
排序对于解决您的问题来说是一个太强大的工具:您正在计算 vector 的整个顺序,但您只关心前几个。对于每个 vector ,您知道有多少元素构成了前 5%,因此您应该让 一个 遍历数组并找到最大的 k
而不是对整个事物进行排序。您可以用 O(n)
的时间和 k
的额外空间完成此操作,因此这可能是总体上的胜利。
关于c++ - std::nth_element 的 SIMD 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20147665/
我很难掌握应该如何使用 std::nth_element ,因为我有点生疏。 裁判说: Rearranges the elements in the range [first,last), in su
有人知道 std::nth_element 的不同实现的预期运行时间和最坏情况下的运行时间吗?我几乎每天都使用这个算法。 我对最近的 Microsoft 编译器附带的 STL 版本特别感兴趣,但有关此
StackOverflow 和其他地方有很多声称 nth_element 是 O(n) 并且通常使用 Introselect 实现的声明:http://en.cppreference.com/w/cp
我明白 (1) std::nth_element对跨越 [first, last) 的数组元素进行排序,使得 !(*j > *i) 适用于 [first, nth) 中的任何 i 和 [nth, la
我正在尝试使用第 nth_element 找到 (x,y) 点的 vector 的中值 cv::Point2f medOffset; vector tempOffset
我想在一个类中将函数 nth_element 与我自己的排序函数(应该可以访问对象的数据)一起使用。目前,我正在做以下事情: class Foo { public: glm::vec3 *po
我想用 C++ 计算 float 组的中值: float Median( FloatArray const * constFloatArray ) { FloatArray scratc
我想从给定的未排序 vector 中获取第 n 个最小的元素。我发现标准库中有一个方法。但是我不明白下面的结果。 我使用条目为 {3,4,5,2,3} 的 vector ,并希望获得第二小的元素。如果
来自 std::nth_element 的文档我们有: template void nth_element( RandomIt first, RandomIt nth, RandomIt last )
前面章节中,已经给大家介绍了 sort()、stable_sort()、partial_sort() 这些函数的功能和用法,本节再介绍一个排序函数,即 nth_element() 函数。 不过,在系统
我看过一段代码: template T getMedian(vector& data_vec) { assert(!data_vec.empty()); typename vector
下面的代码将无法编译。第 2 行到最后一行 (nth_element...) 有错误。这似乎与比较器有关。编译器声称“术语不计算为采用 2 个参数的函数”。如何修复编译错误? struct R
我想在 python 中实现 Vantage Point Tree,但它使用 C++ 中的 std::nth_element。 所以我想在 Python 或 numpy 中找到等效的“nth_elem
根据 cppreference.com,C++ STL 排序算法的复杂度为: 排序:O(N log(N)) partial_sort:“大约”O(N log(M)),其中 M 是距离(中间优先) nt
我不想得到排序数组,只是第 n 个元素的值。例如,给定数组 a = [20, 5, 1, -3] 我希望能够查询 nth_element(a,2) = 1 在 C++ 中,有一个函数 std::nt
我在任何地方都没有找到这个特定的主题... 我在 23 个整数的 std::vector 中调用 nth_element() 算法大约 400,000 次,更精确的“无符号短”值。 我想提高计算速度,
我有一个算法可以在我的双核 3 GHz Intel 处理器上平均运行 250 毫秒,我正在尝试优化它。目前,我有一个 std::nth_element在 std::vector 上调用了大约 6,00
我正在将一些 C++ 代码移植到 C#。 C# 是否有等价于 std::nth_element()还是我需要自己动手? 最佳答案 我假设您正在寻找一个访问器,该访问器通过对集合执行部分排序来返回无序集
我感兴趣的是找到 vector 中等于中位数的第一个(最左边)元素的最有效方法。找到中位数很简单: std::nth_element(first, middle, last); auto median
我正在自学 c++ 和 eigen,所以也许这是一个简单的问题。 给定 n 和 0 "<"m "<"n,以及一个 n vector d 的 float 。具体来说: VectorXf d = Vect
我是一名优秀的程序员,十分优秀!