为什么java.util.concurrent.PriorityBlockingQueue使用数组而不是链表
在我看来,数组最大的优点是我们可以使用O(1)访问任何元素。但队列只能从头部或尾部访问 此外,PriorityBlockingQueue是一个排序的集合,这意味着每一次添加操作都会导致所有较大(或较小)的元素移位。那相当贵为什么java.util.concurrent.PriorityBlockingQueue使用数组而不是链表,java,arrays,list,data-structures,queue,Java,Arrays,List,Data Structures,Queue,在我看来,数组最大的优点是我们可以使用O(1)访问任何元素。但队列只能从头部或尾部访问 此外,PriorityBlockingQueue是一个排序的集合,这意味着每一次添加操作都会导致所有较大(或较小)的元素移位。那相当贵 因此,我不明白为什么不使用链表来代替。因为底层数据结构实际上是一个二进制堆,它通过数组实现的效率最高,而数组又在添加和删除时提供了O(log(N))性能。LinkedList不可能像堆那样高效 此外,PriorityBlockingQueue是一个排序的集合,这意味着每一次添
因此,我不明白为什么不使用链表来代替。因为底层数据结构实际上是一个二进制堆,它通过数组实现的效率最高,而数组又在添加和删除时提供了O(log(N))性能。
LinkedList
不可能像堆那样高效
此外,PriorityBlockingQueue是一个排序的集合,这意味着每一次添加操作都会导致所有较大(或较小)的元素移位
不会的。它将导致重新堆化操作,这比您所描述的效率要高得多。因为底层数据结构实际上是一个二进制堆,它通过数组实现的效率最高,并且在添加和删除时提供O(log(N))性能。
LinkedList
不可能像堆那样高效
此外,PriorityBlockingQueue是一个排序的集合,这意味着每一次添加操作都会导致所有较大(或较小)的元素移位
不会的。这将导致重新heapify操作,这比您描述的效率要高得多
此外,PriorityBlockingQueue是一个排序的集合,这意味着每一次添加操作都会导致所有较大(或较小)的元素移位
您误解了PriorityBlockingQueue
的内部工作原理:它不会在整个数组中上下移动;那确实太贵了。相反,它使用一个名为的数据结构,该结构使用一个数组作为其存储,但不对其应用“普通”索引。相反,它以类似于树的方式存储项,使得O(log2n)插入和删除成为可能
有关PriorityBlockingQueue
如何维护堆的详细信息,请参阅PriorityQueue.java
中的shiftDown
和shiftUp
此外,PriorityBlockingQueue是一个排序的集合,这意味着每一次添加操作都会导致所有较大(或较小)的元素移位
您误解了PriorityBlockingQueue
的内部工作原理:它不会在整个数组中上下移动;那确实太贵了。相反,它使用一个名为的数据结构,该结构使用一个数组作为其存储,但不对其应用“普通”索引。相反,它以类似于树的方式存储项,使得O(log2n)插入和删除成为可能
有关
PriorityBlockingQueue
如何维护堆的详细信息,请参阅PriorityQueue.java
中的shiftDown
和shiftUp
查看由数组支持的堆数据结构PriorityBlockingQueue
应该使用类似的策略。建议:使用堆搜索优先级队列的实现,并实现最小(或最大)堆,然后您将知道使用数组的原因(使用数组很容易实现堆,而且它的效率也很高,因为它不涉及元素的移动,它只涉及赋值、元素交换{而不移动其他索引处的元素},以及访问已知索引处的元素进行比较,这些操作在数组中是有效的)查看由数组支持的堆数据结构。PriorityBlockingQueue
应使用类似的策略。建议:使用heap搜索优先级队列的实现,并实现最小(或最大)堆,然后您将知道使用数组的原因(使用数组很容易实现堆,而且它的效率也很高,因为它不涉及元素的移动,它只涉及赋值、元素交换{而不移动其他索引处的元素},以及访问已知索引处的元素进行比较,这些操作在数组中是有效的)