c++ - 一种用于对等值条目进行排序和改组的快速算法(最好使用 STL)

标签 c++ algorithm sorting stl shuffle

我目前正在开发随机优化算法并遇到了以下问题(我想它也出现在其他地方):它可以称为完全不稳定的部分排序:

Given a container of size n and a comparator, such that entries may be equally valued. Return the best k entries, but if values are equal, it should be (nearly) equally probable to receive any of them.

(输出顺序与我无关,即最好的 k 中完全相等的值不需要打乱。然而,甚至打乱所有相等的值是一个相关的、有趣的问题,并且会够了!)

一种非常(!)低效的方法是使用 shuffle_randomly,然后使用 partial_sort,但实际上只需要在“选择时”对等值条目 block 进行洗牌border"(resp. 所有等值条目的 block ,两者都快得多)。也许观察是开始的地方......

如果有人可以提供带有 STL 算法的解决方案(或至少提供大部分),我非常希望这样做,因为它们通常速度非常快、封装良好且 OMP 并行化。

提前感谢任何想法!

最佳答案

您想partial_sort首先。然后,当元素不相等时,返回它们。如果遇到大于剩余 k 的相等元素序列,则打乱并返回第 k 个。否则全部返回并继续。

关于c++ - 一种用于对等值条目进行排序和改组的快速算法(最好使用 STL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13323711/

相关文章:

python - 获取列表中的最大元组

C++:求解三次方程

c++ - 如何为静态类模板特化模拟构造函数?

c++ - 跨越 COM 方法边界的 C++ 异常会发生什么情况?

algorithm - 我可以在一致的启发式/统一成本/Dijkstra 搜索下修改标准 A*(A 星),以便它不必更新边界吗?

algorithm - 回溯优化

java - 找到 3 个整数的最高乘积的最简单实现

c++ - 具有重复键的快速排序算法

c++ - Qt moc.exe - 32 位和 64 位版本之间的区别?

linux - 文件列表到文本文件,按 a-z 顺序排列,每个结果对应一个新行