【问题标题】:proving level of median in heap证明堆中位数的水平
【发布时间】:2020-04-20 02:33:48
【问题描述】:

我需要证明二叉堆的中位数(不管是最小堆还是最大堆)可以在堆的最低级别(在叶子中)。我不确定如何证明。我考虑过使用堆是完整的二叉树这一事实,但我不确定。如何证明?

【问题讨论】:

  • “可以”是什么意思? “有一个堆......”或“任何堆的元素都可以重新排列......”?
  • 我的意思是有一个堆这样......
  • 取一个所有元素都相同的堆。
  • 还有其他方法可以证明吗?

标签: algorithm median binary-heap


【解决方案1】:

正如@Evg 在 cmets 中提到的,如果所有元素都相同,那么这是微不足道的。假设所有元素都需要不同,让我们关注奇数节点 2H+1 和最小堆的情况(最大堆情况类似)。要创建中位数位于底部的最小堆,首先插入最小的 H 元素。

有两种情况。情况1;这样做之后,由这些 H 元素形成的二叉树被完全填充(每一层都被填充)然后你可以在最后一层插入剩余的 H+1 个元素(你可以这样做,因为最后一层的最大容量等于( #total_nodes+1)/2 正好是 H+1)。

案例 2 最后一层仍有一些未填充的空间。在这种情况下,从最大的 H 元素中取出最小的剩余节点,直到该层被填充(请注意,堆中不会向上移动,因为这些元素已经大于树中的任何内容)。然后通过插入中位数开始下一层。最后通过构造插入剩余的节点,它们也不会向上移动,因为它们比上一层中的任何东西都大。同理最后一层的容量,在这个过程中你不需要启动一个新的层。

如果节点数量为偶数 2H,你可以类似地争论,但是你必须将中位数定义为 H+1 最小节点(否则你要证明的陈述是错误的,如你所见注意到集合 {1,2} 唯一可能的最小堆是根为 1 且叶为 2 的树。

【讨论】:

    【解决方案2】:

    证明它的最简单方法就是制作一个:

                        1
                 2             3
              4     5       6     7
    

    任何具有按级别顺序的节点的完整堆都将在最左侧的叶子中具有中值,但您不必证明

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 2023-03-27
      • 2010-09-08
      • 2013-05-15
      相关资源
      最近更新 更多