【问题标题】:Why is java.util.concurrent.PriorityBlockingQueue using an array not a linked list为什么 java.util.concurrent.PriorityBlockingQueue 使用数组而不是链表
【发布时间】:2018-10-23 16:10:14
【问题描述】:

在我看来,数组最大的优点是我们可以用 O(1) 访问任何元素。但是队列只能从头部或尾部访问。

此外,PriorityBlockingQueue 是一个排序集合,这意味着每个添加操作都会导致所有较大(或较小)的元素发生移位。太贵了。

所以我不明白为什么不使用链表。

【问题讨论】:

  • 看一下由数组支持的堆数据结构。 PriorityBlockingQueue 应该使用类似的策略。
  • 建议:搜索Implementation of Priority Queue using HeapImplementing Min(或Max)Heap你就会知道为什么使用数组(Heap使用数组很容易实现,而且它很高效,因为它不涉及元素的移动,它只涉及分配、交换元素{不移动其他索引处的元素},以及访问已知索引处的元素以进行比较,这些操作是在数组中有效)

标签: java arrays list data-structures queue


【解决方案1】:

因为底层数据结构实际上是一个二叉堆,它通过数组最有效地实现,而这反过来又提供了 O(log(N)) 的添加和删除性能。 LinkedList 不可能像堆一样高效。

此外,PriorityBlockingQueue 是一个排序集合,这意味着每个添加操作都会导致所有较大(或较小)的元素发生移位。

不,不会。这将导致重新堆操作,这比您描述的要高效得多。

【讨论】:

    【解决方案2】:

    此外,PriorityBlockingQueue 是一个排序集合,这意味着每个添加操作都会导致所有较大(或较小)的元素发生移位。

    您误解了PriorityBlockingQueue 的内部工作原理:它不会在整个数组中上下移动;那确实太贵了。相反,它使用了一个名为heap 的数据结构,它使用一个数组来存储它,但不对它应用“普通”索引。相反,它以树状方式存储项目,使得 O(log2n) 次插入和删除成为可能。

    有关PriorityBlockingQueue 如何维护堆的详细信息,请参阅shiftDown 中的implementationsPriorityQueue.java 中的shiftUp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-21
      • 2020-06-01
      • 2014-08-26
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2014-03-06
      • 2015-09-29
      相关资源
      最近更新 更多