我在文档中看到,
PriorityQueue.peek() 使我可以在 O(1) 中访问队列的头部,但是如果我需要访问队列中的 k 个顶部元素怎么办?
我会使用 poll()
k 次,但这需要 O(log(N)) ,有没有办法在恒定时间内做到这一点?
最佳答案
不可能在恒定时间内完成。 如果您的数据已经在 PriorityQueue
中,那么您可以最好的方法是将前 k 个元素一一删除。 Each remove costs you O(log(n))
但你也想通了,因此问题。
但是,如果您不是被迫使用 PriorityQueue
,那么您可以对列表进行部分排序并检索前 k 个元素。部分排序的渐近复杂度是 O(n*log(k))
。如果我们还考虑到设置优先级队列的成本,它可以比 PriorityQueue
方法执行得更快,参见 Selecting top k items from a list efficiently in Java / Groovy(从 1000 万的列表中选择前 5 个元素,PriorityQueue 300ms vs.部分排序 170ms)。
关于java - 在 Java 中,如何 peek() PriorityQueue 中的前 k 个元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21946406/