代码之家  ›  专栏  ›  技术社区  ›  Pasha

在Java PriorityQueue中,为什么队列[n]的子级是队列[2*n+1]和队列[2*(n+1)]?

  •  0
  • Pasha  · 技术社区  · 5 年前

    Java中的最小堆实现由PriorityQueue表示,PriorityQueue由 transient Object[] queue;

    其javadoc中的引用是

    优先级队列表示为一个平衡的二进制堆:两个子堆 队列[n]的类型包括队列[2n+1]和队列[2(n+1)]。

    为什么不像蒂姆·劳夫加登在这里说的那样排队[2n]和排队[2n+1” https://www.coursera.org/learn/algorithms-graphs-data-structures/lecture/KKqlm/heaps-implementation-details-advanced-optional 08:00?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Brian_E    5 年前

    正如caco3在命令中提到的,如果优先级队列中的元素存储在一个数组中,那么该优先级队列数据结构的设计者可以决定将数组中的第一项存储在位置0或位置1。

    将第一项置于位置0意味着孩子们处于位置2N+1和2N+2。当第一项存储在位置1时,子项位于位置2N和2N+1。

    任何一种选择都可能导致正确的实现。从0开始可以节省一点空间。但有些人觉得从1开始,数学和代码就更优雅了。