优先级队列消除了复杂性时间

时间:2012-10-04 01:08:50

标签: java complexity-theory time-complexity priority-queue

Java中Priority Queue类的remove()函数的复杂性(大哦)是多少?我无法在任何地方找到任何记录,我认为它是O(n),考虑到你必须在删除之前找到该元素然后重新洗牌。但我看到其他人不同意并认为这是O(登录)。有什么想法吗?

4 个答案:

答案 0 :(得分:24)

删除的复杂性是O(N),因为contains的复杂性是O(N)(在java的优先级队列类中)

可以在您自己的优先级队列实现中使用O(logN)的一种方法是维护一个辅助数据结构,如HashMap,它维护从优先级队列中的值到其位置的映射在队列中。因此,在任何给定时间 - 您将知道任何值的索引位置。

请注意,此修改不会影响任何现有操作的运行时间 - 您只需要在heapify操作期间更新映射。

答案 1 :(得分:23)

混淆实际上是由“删除”功能引起的。在java中,有两个删除函数。

  1. remove() - >这是为了删除头/根,它需要O(logN)时间。

  2. remove(Object o) - >这是删除任意对象。查找此对象需要O(N)时间,删除它需要O(logN)时间。

答案 2 :(得分:5)

根据Oracle文档: "实施说明:此实施为入队和出队方法提供 O(log(n))时间(offer,poll, remove()和add); remove(Object)和contains(Object)方法的线性时间;和检索方法的持续时间(窥视,元素和大小)。"

Link here to Oracle Doc

答案 3 :(得分:0)

请检查: http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

“此实现为入队和出队方法(offer、poll、remove() 和 add)提供了 O(log(n)) 时间;remove(Object) 和 contains(Object) 方法的线性时间”

因此对于 poll() 和 remove(),'log(N) 但是对于remove(object),那个log(N)