假设所有元素都是不同的,那么最小的元素可能位于 max-heap 中的什么位置?
Where in a max-heap might the smallest element reside, assuming that all elements are distinct?
问题:假设所有元素都不同,max-heap 中最小的元素可能位于何处?
我了解到在max-heap中,最大的节点是根节点,最小的节点是叶子节点之一。我发现答案说它在任何叶子中,即索引为 ⌊n/2⌋+k
的元素,其中 k>=1
,即在堆数组的后半部分。
问题: 你能解释一下为什么我找到的答案不只是说它是叶子之一吗?你能解释一下为什么要通过 ⌊n/2⌋+k
回答吗?第二,为什么在后半部分,当它在树的最后一层时,所有 parent 都大于它们的 children,所以高度 1 的 child 小于parent 但大于其 child 等等。
已编辑:你能解释一下为什么叶子的索引是⌊n/2⌋+1, ⌊n/2⌋+2, ..., ⌊n/2⌋+n
吗?或者为什么最后一个 non-leaf 节点的索引在 array-based 堆的 ⌊n/2⌋
处?我们知道堆的总顶点数由 Ceil(n/2^(h+1))
给出。叶子数是Ceil(n/2)
,所以希望额外的细节能帮助解决这个问题。
在一个zero-based索引数组中,根在索引0。根的children在索引1和2。一般来说索引的children位于索引 2+1 和 2+2。
所以一个节点要有children,我们必须让2+1(即左边的child)还在数组的范围内,即2+1 < ,数组的大小在哪里(即最后一个索引为 -1)。
第一个叶子的索引是什么?那将是 2+1 < 不成立的最小值,即当 2+1 ≥ 时。从中我们可以得出:
表示叶子的所有索引都组合在一起。他们都在 ,为此 2+1 ≥
叶子的最小索引在index = ⌊/2⌋.
如果您正在使用 one-based 索引数组(这在伪代码中很常见),那么您可以调整上述推理来得出第一个叶子位于索引 = ⌊ /2⌋+1.
所以你引用的答案是假设一个从 1 开始的索引数组,然后说第一个叶子位于 ⌊/2[=28= 是正确的]⌋+1,并且任何叶子在⌊/2⌋[=37=的位置]+,其中 ≥1.
问题:假设所有元素都不同,max-heap 中最小的元素可能位于何处?
我了解到在max-heap中,最大的节点是根节点,最小的节点是叶子节点之一。我发现答案说它在任何叶子中,即索引为 ⌊n/2⌋+k
的元素,其中 k>=1
,即在堆数组的后半部分。
问题: 你能解释一下为什么我找到的答案不只是说它是叶子之一吗?你能解释一下为什么要通过 ⌊n/2⌋+k
回答吗?第二,为什么在后半部分,当它在树的最后一层时,所有 parent 都大于它们的 children,所以高度 1 的 child 小于parent 但大于其 child 等等。
已编辑:你能解释一下为什么叶子的索引是⌊n/2⌋+1, ⌊n/2⌋+2, ..., ⌊n/2⌋+n
吗?或者为什么最后一个 non-leaf 节点的索引在 array-based 堆的 ⌊n/2⌋
处?我们知道堆的总顶点数由 Ceil(n/2^(h+1))
给出。叶子数是Ceil(n/2)
,所以希望额外的细节能帮助解决这个问题。
在一个zero-based索引数组中,根在索引0。根的children在索引1和2。一般来说索引的children位于索引 2+1 和 2+2。
所以一个节点要有children,我们必须让2+1(即左边的child)还在数组的范围内,即2+1 < ,数组的大小在哪里(即最后一个索引为 -1)。
第一个叶子的索引是什么?那将是 2+1 < 不成立的最小值,即当 2+1 ≥ 时。从中我们可以得出:
表示叶子的所有索引都组合在一起。他们都在 ,为此 2+1 ≥
叶子的最小索引在index = ⌊/2⌋.
如果您正在使用 one-based 索引数组(这在伪代码中很常见),那么您可以调整上述推理来得出第一个叶子位于索引 = ⌊ /2⌋+1.
所以你引用的答案是假设一个从 1 开始的索引数组,然后说第一个叶子位于 ⌊/2[=28= 是正确的]⌋+1,并且任何叶子在⌊/2⌋[=37=的位置]+,其中 ≥1.