在线性时间内查找未排序列表的前n个元素

时间:2019-03-06 22:19:57

标签: time queue heap priority-queue selection-sort

我被问到如何在未排序的数组中查找顶部log(n)元素。我知道我可以在O(n)时间内使用选择算法来执行此操作,以找到第log(n)个最大元素,然后查找所有大于它的元素。但是,是否也可以在O(n)时间内使用堆或其他优先级队列呢?

谢谢

1 个答案:

答案 0 :(得分:0)

要从未排序的列表中获取前k个项目,请使用Quickselect算法对数组进行分区,以使前k个元素位于数组的开头。

快速选择平均为O(n)。但是,在病理情况下,可能需要O(n ^ 2)时间。

使用堆,从n列表中选择前k个元素为O(n log k)。如果您要获取第一个log(n)项,则为k = log(n),复杂度为O(n log(log(n))。

从性能的角度来看,使用堆从列表中选择最重要的log(n)项几乎可以肯定比使用Quickselect更快。原因是即使快速选择(平均)是线性的,它也具有很高的常数。从1,000,000个列表中选择前10个项目几乎与选择前100,000个项目花费相同的时间。但是my research表明,当要选择的项数比项目总数小得多(小于1%)时,使用堆来进行选择要比Quickselect更快。考虑到1,000,000的对数基数2约为20,几乎可以肯定堆选择算法将比Quickselect更快。