【问题标题】:Where in a max-heap might the smallest element reside, assuming that all elements are distinct?假设所有元素都是不同的,那么最小元素可能位于最大堆中的哪个位置?
【发布时间】:2021-10-22 22:20:59
【问题描述】:

问题:假设所有元素都是不同的,那么最小的元素可能驻留在最大堆中的什么位置?

我知道在最大堆中,最大的节点是根节点,最小的节点是叶子节点之一。我找到了答案,它说它在任何叶子中,即索引为⌊n/2⌋+k的元素,其中k>=1 ,即在堆数组的后半部分。

问题:你能解释一下为什么我找到的答案不只是说它是一片叶子吗?你能解释一下为什么回答⌊n/2⌋+k吗?其次,为什么在下半部分,当它在树的最后一层时,考虑到所有父母都大于他们的孩子,所以高度为 1 的孩子比父母小,但比它的孩子大,依此类推。

已编辑:你能解释一下为什么叶子的索引是⌊n/2⌋+1, ⌊n/2⌋+2, ..., ⌊n/2⌋+n吗?或者为什么最后一个非叶节点的索引在基于数组的堆的⌊n/2⌋?我们知道堆的总顶点数由Ceil(n/2^(h+1)) 给出。叶子编号是Ceil(n/2),所以希望额外的细节有助于解决问题。

【问题讨论】:

  • 您使用的是从零开始还是从一开始的索引?

标签: algorithm heap


【解决方案1】:

在从零开始的索引数组中,根位于索引 0。根的子级位于索引 1 和 2。通常索引?的子级位于索引 2?+1 和 2?+2。

所以对于一个节点有孩子,我们必须让 2?+1(即左孩子)仍在数组的范围内,即 2?+1

第一个叶子的索引是什么?这将是 2?+1

  • 代表叶子的所有索引都组合在一起。它们都在 ?,其中 2?+1 ≥ ?

  • 叶子的最小索引在索引? = ?/2

如果您正在使用基于 1 的索引数组(在伪代码中很常见),那么您可以调整上述推理以得出第一个叶子位于索引 ? = ? /2+1.

所以你引用的答案是假设一个基于 1 的索引数组,然后说第一个叶子位于 ?/2 是正确的+1,并且 任何 叶子在位置 ?/2+?,其中?≥1。

【讨论】:

  • 非常感谢。我使用基于 0 的。我意识到既然堆的节点是由n/2^(h+1)给出的,那么非叶子的最后一个节点是floor(n/2^(h+1)),问题就解决了。我可以增加floor(n/2^(h+1))+1...floor(n/2^(h+1))+n`
  • 该公式中的h 是什么?我的回答表明这仅取决于n,而不是其他任何东西。
  • h 是堆的高度。如果h=0我们可以看到它会给叶子,当h=1它会给叶子的父母。所以我用这个事实取了floor(n/2^(h+1))。这就是我解决它的方法。再次感谢。
  • 哦,好吧,那么确实,h=2 会给祖父母...这是您在问题中没有提到的一些方面。
  • 你的问题没问题。举几个例子,你本可以付出更多的努力来找出索引的位置。然后你表现出努力,这总是在这里受到赞赏。如果有人在第一次阅读时感到缺乏努力,他们可能会投反对票(并继续前进)。
猜你喜欢
  • 1970-01-01
  • 2018-04-03
  • 2019-04-11
  • 2020-07-06
  • 2015-02-25
  • 2011-02-26
  • 2015-08-11
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多