c++ - 在未排序的数组中查找最小/最大 K 元素的最有效算法是什么?
问题描述
我有一个未排序的 N 个元素的向量,并且想找到 K 个最小或最大的元素。K 预计为 K << N 远小于 N,但算法应该是稳健的,以便对于较大的 K 值也有效,例如 N 的 50-80%。
沿着重用快速排序的思路思考意味着使用第 K 个最小/最大元素作为分区的枢轴。但是找到第 K 个最小/最大值已经在计算 OP 的解决方案。
这是快速排序的分区位:
template<typename T>
int partition(std::vector<T>& arr, int low, int high, T pivot) {
int i = (low - 1);
for (int j = low; j <= high - 1; ++j) {
if (arr[j] <= pivot) {
i++;
std::swap(arr[i], arr[j]);
}
}
std::swap(arr[i + 1], arr[high]);
return (i + 1);
}
如果我知道该pivot
值对应于第 K 个最小/最大的值,那么我可以使用上面的分区来解决我的 OP。
解决方案
Partial_sort会将最少(最多)的 K 个元素放在一个容器的前面,并对它们进行排序。像这样称呼它
std::partial_sort(arr.begin(), arr.begin() + K, arr.end());
std::partial_sort(arr.begin(), arr.begin() + K, arr.end(), std::greater<>());
它将运行大约 N log K 时间
推荐阅读
- apache-kafka - NestJs - Kafka 对有效负载进行过滤
- android - Android Thread AsyncTask、Executor 和 Service 的区别
- mongodb - 使用 Spring data mongodb queryDSL 创建正确的查询
- java - 即使设置了适配器,RecyclerView 也不显示
- vue.js - 使用 nuxt-child 的布局而不是父级的布局
- arrays - 如何计算数组中值的平均值?
- html - 改变位置绝对父级
- linq - 如何编写按一个属性分组并返回不同列表的 SQL 可翻译 linq 代码
- c++ - 即使满足条件,while循环也不起作用
- asp.net-core - 自包含应用程序不发布运行时