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