这是在包含非唯一元素的未排序数组中选择第k个最大数的最快算法

Which is the fastest algorthm for selecting kth largest number in an unsorted array containing non -unique elements?

本文关键字:选择 最大数 算法 数组 包含非 唯一 元素 排序      更新时间:2023-10-16

可能重复:
如何在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个最大的,我需要添加一两个论点,我今天晚些时候会添加。