Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java.util.concurrent.PriorityBlockingQueue使用数组而不是链表_Java_Arrays_List_Data Structures_Queue - Fatal编程技术网

为什么java.util.concurrent.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(1)访问任何元素。但队列只能从头部或尾部访问

此外,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搜索优先级队列的实现,并实现最小(或最大)堆,然后您将知道使用数组的原因(使用数组很容易实现堆,而且它的效率也很高,因为它不涉及元素的移动,它只涉及赋值、元素交换{而不移动其他索引处的元素},以及访问已知索引处的元素进行比较,这些操作在数组中是有效的)