您可以在内存和O (n log k )时间中做到这一点,方法是从O (k )时间中的前k个元素形成固定大小的最大堆,然后遍历数组的其余部分并推入新的元素,然后为每个元素弹出O (log k ),得到总时间O (k + n log k ) = O (n log k )。O(k)O(nlogk)kO(k)O(logk)O(k+nlogk)O(nlogk)
通过使用中位数中值选择算法,在k处选择并返回前k个元素,可以在辅助存储器和O (n )时间中进行操作。在不改变渐近性的情况下,您可以使用introselect加快平均情况。这是解决问题的规范方法。O(logn)O(n)kk
现在从技术上讲和O (k )是无法比拟的。但是我认为O (log n )在实践中更好,因为考虑到没有计算机系统具有超过2 64个字节的内存,log 2 64 = 64,它实际上是恒定的。同时,k可以增长到与n一样大。O(logn)O(k)O(logn)264log264=64kn