左式堆分析

左式堆

在右路径上有r个节点的左式堆必然至少有 2 r − 1 2^r-1 2r1个节点

右路径是从根节点开始,一直往右儿子遍历经过的所有节点(即右儿子的右儿子的右儿子······构成的路径)。如图1所示,右路径为3,8
在这里插入图片描述

使用数学归纳法证明此定理

  1. r = 1 r=1 r=1

    此时根节点的右子树为空, n p l ( r i g h t ) = − 1 npl(right) = -1 npl(right)=1,依据左式堆的性质, n p l ( l e f t ) ≥ n p l ( r i g h t ) npl(left)\geq npl(right) npl(left)npl(right),即左子树零路径长最小时 M i n n p l ( l e f t ) = − 1 Min_{npl(left)}=-1 Minnpl(left)=1,此时根节点左子树为空,此左式堆只有一个根节点。当 r = 1 r=1 r=1时, 2 r − 1 = 1 2^r-1=1 2r1=1,因此当 r = 1 r=1 r=1时定理成立。

  2. 假设右路径上有r个节点时,定理成立,左式堆必然至少有 2 r + 1 2^r+1 2r+1个节点

  3. 当右路径有 r + 1 r+1 r+1个节点时

    依据左式堆的性质我们可以知道,每个节点的零路径长等于其右路径的节点数减一(也是其右儿子的根节点的零路径长加一)。这是因为左式堆要求左边节点的零路径长大于等于右边节点,那么只有一直往右,才能以最短路径到达叶子节点。所以根节点的零路径长与右路径相关。

    当右路径有 r + 1 r+1 r+1个节点时,根节点的右儿子的零路径长 n p l ( r i g h t ) = r − 1 npl(right)=r-1 npl(right)=r1
    ∵ n p l ( l e f t ) ≥ n p l ( r i g h t ) ∴ M i n n p l ( l e f t ) = r − 1 \because npl(left)\geq npl(right) \\ \therefore Min_{npl(left)}=r-1 npl(left)npl(right)Minnpl(left)=r1
    因为每个节点的零路径长等于其右路径的节点数减一,所以当根节点的左儿子的最小零路径长为 r − 1 r-1 r1时,根节点的左子树的右路径上有r个节点,根据假设,根节点的左子树作为一棵左式堆必然至少有 2 r + 1 2^r+1 2r+1个节点。同理,根节点的右子树作为一棵左式堆必然至少有 2 r + 1 2^r+1 2r+1个节点。

    原左式堆的节点数=根节点的左子树的节点数+根节点的右子树的节点数+根节点节点数(也就是1)

    所以原左式堆的节点数至少为 2 r + 2 r + 1 = 2 r + 1 + 1 2^r + 2^r + 1=2^{r+1}+1 2r+2r+1=2r+1+1

综上所述,定理得证

左式堆的合并

左式堆的合并是递归操作的

  1. 若其中一个堆为空堆,则返回另一个堆;若两个堆都不为空,则比较两左式堆的根节点,并返回较小堆(A堆)的根节点作为新堆的根节点,返回A堆的左子树作为新堆的左子树
  2. 将A堆的右子树与根节点较大的左式堆(B堆)作为参数输入步骤1,并取返回值作为新堆的右子树
  3. 若新堆破坏了左式堆的性质(即不满足 n p l ( l e f t ) ≥ n p l ( r i g h t ) npl(left)\geq npl(right) npl(left)npl(right)),那么将新堆的左右子树进行交换

在合并两棵左式堆时,将重复执行步骤1和步骤2,直到一个输入参数的堆为空堆,此时才能得到确切的新堆(最下层的新堆)。这个步骤是一路沿右路径进行深入的

当得到确切的新堆后即可判断新堆是否符合左式堆的性质,并做相应操作。下层新堆调整正确后即可确定上层新堆(浅一层)并做步骤3的重复操作。这个步骤是沿着右路径从叶子节点一路向上的

因为在右路径上有r个节点的左式堆必然至少有 2 r − 1 2^r-1 2r1个节点,所以一棵左式堆若有N个节点,则右路径长度为 O ( log ⁡ N ) O(\log N) O(logN)。合并操作是沿着右路径进行的,那么左式堆的合并操作的时间复杂度为 O ( log ⁡ N ) O(\log N) O(logN)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值