java - 优先队列 poll() 时间复杂度

标签 java queue time-complexity big-o priority-queue

给定以下代码:

pq.offer(x);
pq.poll();

第一行代码,将元素x插入优先队列pq,offer的时间复杂度为log(k),其中k为pq的大小。

那么我的问题是,对于紧跟在第一行之后的第二行代码,poll() 的时间复杂度是多少?

在第一行offer之后,pq已经排序了,所以poll会简单的获取并移除队列的头部,那么我认为应该是O(1 ), 正确吗?

谢谢

最佳答案

根据PriorityQueue#poll的源码, 好像操作是O(log n) :

@SuppressWarnings("unchecked")
public E poll() {
    if (size == 0)
        return null;
    int s = --size;
    modCount++;
    E result = (E) queue[0];
    E x = (E) queue[s];
    queue[s] = null;
    if (s != 0)
        siftDown(0, x);
    return result;
}

这是因为 siftDownO(log n) ,由于 PriorityQueue 中的数据存储为堆。

关于java - 优先队列 poll() 时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46517400/

相关文章:

java - 在 Java 中实现自己的 List、Stack、Queue 或其他数据结构的原因

java - JAVA中无等待队列的实现

堆栈的Java实现

sql - 按降序对列表进行排序的时间复杂度。

python - 这个方程的时间复杂度是O(n)吗?

java - 如何在 Java 8 中填充 map ?

java - 当该字符串中有空格时,是否可以按字符串获取枚举?

java - 如何从媒体播放器创建音频文件

java - 无法实例化 itextpdf 的类型列表

laravel - 当使用 --tries=0 时,PHP 错误将作业推送到延迟队列中