鉴于以下代码:
pq.offer(x);
pq.poll();
对于第一行代码,元素x被插入到Priority Queue pq中,offer
的时间复杂度为log(k),其中k是pq的大小。
然后我的问题是,对于紧接在第一行之后的第二行代码,poll()
的时间复杂度是多少?
在第一行offer
之后,pq已经被排序了,所以poll
将只是检索并删除队列的头部,那么我认为它应该是O(1),对吗?
由于
答案 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;
}
这是因为siftDown
是O(log n)
,因为PriorityQueue
中的数据被存储为堆。
答案 1 :(得分:2)
添加和删除基于堆的PQ都是 O(log(N))。