Java中Priority Queue类的remove()
函数的复杂性(大哦)是多少?我无法在任何地方找到任何记录,我认为它是O(n),考虑到你必须在删除之前找到该元素然后重新洗牌。但我看到其他人不同意并认为这是O(登录)。有什么想法吗?
答案 0 :(得分:24)
删除的复杂性是O(N),因为contains的复杂性是O(N)(在java的优先级队列类中)
可以在您自己的优先级队列实现中使用O(logN)的一种方法是维护一个辅助数据结构,如HashMap,它维护从优先级队列中的值到其位置的映射在队列中。因此,在任何给定时间 - 您将知道任何值的索引位置。
请注意,此修改不会影响任何现有操作的运行时间 - 您只需要在heapify操作期间更新映射。
答案 1 :(得分:23)
混淆实际上是由“删除”功能引起的。在java中,有两个删除函数。
remove() - >这是为了删除头/根,它需要O(logN)时间。
remove(Object o) - >这是删除任意对象。查找此对象需要O(N)时间,删除它需要O(logN)时间。
答案 2 :(得分:5)
根据Oracle文档: "实施说明:此实施为入队和出队方法提供 O(log(n))时间(offer,poll, remove()和add); remove(Object)和contains(Object)方法的线性时间;和检索方法的持续时间(窥视,元素和大小)。"
答案 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)