【问题标题】:Priority Queue poll() time complexity优先队列 poll() 时间复杂度
【发布时间】:2018-03-13 01:05:48
【问题描述】:

给定下面的代码:

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

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

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

在第一行offer之后,pq已经排好序了,所以poll会简单的取出队列头,那么我认为应该是O(1),对吧?

谢谢

【问题讨论】:

  • Java PriorityQueue 中的项目未排序。项目被插入到binary heap,这是一个有序但不一定存储的数据结构。
  • @JimMischel - 它们存储得很好。只是没有排序。
  • @HenkHolterman:谢谢。看起来昨晚我是typos-r-us的CEO。

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


【解决方案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 中的数据被存储为堆。

【讨论】:

  • 非常感谢!是的,我刚刚阅读了源代码,你是正确的。
【解决方案2】:

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

Javadoc 中明确说明了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多