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

时间:2017-10-01 22:13:41

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

鉴于以下代码:

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

对于第一行代码,元素x被插入到Priority Queue pq中,offer的时间复杂度为log(k),其中k是pq的大小。

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

在第一行offer之后,pq已经被排序了,所以poll将只是检索并删除队列的头部,那么我认为它应该是O(1),对吗?

由于

2 个答案:

答案 0 :(得分:3)

根据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中的数据被存储为堆。

答案 1 :(得分:2)

添加和删除基于堆的PQ都是 O(log(N))