算法导论 思考题6-2

6-2(对d叉堆的分析)d叉堆与二叉堆很类似,但(一个可能的例外是)其中的每个非叶节点有d个孩子,而不是仅仅2个。

a. 如何在一个数组中表示一个d叉堆?

假设数组从 A [ 1 ] A[1] A[1]开始,它作为根,那么 A [ 1 ] A[1] A[1]有d个孩子分别是 A [ 2 ] . . . A [ d + 1 ] A[2]...A[d+1] A[2]...A[d+1],共d个。那么对于 A [ 2 ] . . . A [ d + 1 ] A[2]...A[d+1] A[2]...A[d+1]共d个结点,一共有 d 2 d^2 d2个结点,从 A [ d + 2 ] . . . . A [ d 2 + d + 1 ] A[d+2]....A[d^2+d+1] A[d+2]....A[d2+d+1]。依次类推。那么对于一个编号为 i i i的结点的第 j j j个孩子 ( 1 ≤ j ≤ d ) (1 \leq j \leq d) (1jd)

D-ARY-Parent(i)
return ⌊ ( i − 2 ) / d + 1 ⌋ \lfloor (i-2)/d+1 \rfloor (i2)/d+1

D-ARY-Child(i,j)
return ⌊ d ( i − 1 ) + j + 1 \lfloor d(i-1)+j+1 d(i1)+j+1

i的d个结点从 d ( i − 1 ) + 2 到 d i + 1 d(i-1)+2到di+1 d(i1)+2di+1

结合画图,不难推出。

自己可以通过 D-ARY-Parent(D-ARY-Child(i,j))=i 来验证一下。二叉堆是当 d = 2 d=2 d=2时的一个特例。


b. 包含n个元素的d叉堆的高度是多少?请用n和d表示。

类似二叉堆的推导过程。不难的得出一个n个元素的d叉堆,有 Θ ( l o g d n ) = Θ ( l g n / l g d ) \Theta(log_dn)=\Theta(lgn/lgd) Θ(logdn)=Θ(lgn/lgd)


c. 请给出EXTRACT-MAX在d叉堆上的一个有效实现,并用d和n表示出它的时间复杂度。

对于d叉堆的EXTRACT-MAX实现,与树中二叉堆的实现相同,只需要修改MAX-HEAPIFY在下放的过程中,是与d个孩子比较,而不是2个孩子。对于每一层的下放,最差情况下比较d次。那么对于一个n个结点的d叉堆来说。EXTRACT-MAX的时间复杂度为 Θ ( d l o g d n ) = Θ ( d l g n / l g d ) \Theta(dlog_dn)=\Theta(dlgn/lgd) Θ(dlogdn)=Θ(dlgn/lgd)


d. 给出INSERT在d叉最大堆上的一个有效实现,并用d和n表示它的时间复杂度。

树中给出的二叉堆的MAX-HEAP-INSERT的实现同样适用与d叉堆。该过程只需要访问结点的parent结点,其他并没有改变。最坏情况下时间复杂度为 Θ ( h ) \Theta(h) Θ(h)。h为d叉堆的高度,前面已求出, h = Θ ( l g n / l g d ) h=\Theta(lgn/lgd) h=Θ(lgn/lgd)


e. 给出INCREASE-KEY(A,i,k)的一个有效实现,当 k &lt; A [ i ] k&lt;A[i] k<A[i]时,它会触发一个错误,否则执行 A [ i ] = k A[i]=k A[i]=k,并更新相应的d叉最大堆。请用d和n表示出它的时间复杂度。

跟书本的实现一致。只需要将计算parent的结点的公式替换即可。最坏情况下的时间复杂度为 Θ ( h ) = Θ ( l o g d n ) = Θ ( l g n / l g d ) \Theta(h)=\Theta(log_dn)=\Theta(lgn/lgd) Θ(h)=Θ(logdn)=Θ(lgn/lgd)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值