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