这是在包含非唯一元素的未排序数组中选择第k个最大数的最快算法
Which is the fastest algorthm for selecting kth largest number in an unsorted array containing non -unique elements?
可能重复:
如何在O(n)中找到长度为n的未排序数组中的第k个最大元素?
元素的数量可以从1到1000万不等。哪种算法是最快的选择算法?请注意,我认为像AVL树这样的数据结构在这里不会工作,因为数组元素重复?
选择算法可以在O(N)时间内运行。
最常用的方法是遍历数组,保持迄今为止看到的K个最大数字。返回该列表的最后一个元素。正如@ChrisA在评论中指出的那样,std::nth_element
(此处记录)是使用这种方法的最快方法。
如果您总是想要前K个最大的项(并且数据有时会更改),那么可以考虑将数据存储在堆中。这是更昂贵的,但给您一个"实时"的数据结构。
这可以在编译时使用此代码完成(请记住,您需要最新的GCC或Clang,目前在MSVC2k12中不起作用)。它使它编译缓慢,但在运行时是即时的。
#include <iostream>
constexpr int array[10] = { 1, 0, 2, 3, 0, 2, 7, 1, 9, 2 };
template<int maxest, int index>
struct find_biggest_r {
enum { value = find_biggest_r<(array[index] > maxest ? array[index]:maxest),index-1>::value };
};
template<int maxest>
struct find_biggest_r<maxest,0> {
enum { value = (array[0] > maxest ? array[0] : maxest) };
};
template<int index>
struct find_biggest {
enum { value = find_biggest_r<array[index-1],index-2>::value };
};
int main()
{
std::cout << find_biggest<10>::value;
}
编辑:很抱歉,这只是最大的。对于第k个最大的,我需要添加一两个论点,我今天晚些时候会添加。
相关文章:
- 如何从向量或数组中选择最常见的数字?(前五名)C++
- 修改的选择排序,选择最大的数字,然后交换到最后
- 找到不大于 A 的最大数的最有效方法,该数可被 B 整除
- C++:最大数组值函数工作不正常
- 根据浮点数选择最小整数类型
- 在浮点数32中保存浮点数16最大数
- 使用 DP 的非相邻元素的最大数组总和
- 从 3 个数字中选择最大值和最小值,C++
- 找到第 n 个最大数无限循环C++
- 最大数组大小
- C 最大数组大小
- 如何在GPU内存中获取最大数组大小
- 如何使用SFINAE来选择最匹配的类型特征
- 具有最大数组函数的程序
- 选择最大“n”值
- C++ - 选择最大值"n"值
- 这是在包含非唯一元素的未排序数组中选择第k个最大数的最快算法
- 如何递归地找到最大数组元素的索引
- 递归最大数求和
- 如何找到数组中的最大数并用c++显示