算法导论-平摊分析习题解

17.2-3 假设我们希望不仅能使一个计数器增值,也能使之复位至零(即,使其中所有的位都为0)。请说明如何将一个计数器实现为一个位数组,使得对一个初始为零的计数器,任一个包含n个INCREMENT和RESET操作的序列的时间都为O(n)。(提示:保持一个指针指向高位1)

  解:如提示所言,保存一个指针指向高位1。规定把某一位设为1的操作收取4元的平摊费用,其中1元用来支付置位操作的实际代价,剩余3元作为存款。维护指针花费1元,当将该位翻转为0时,花费其中1元,置位花费1元。所以n个操作的序列时间至多为4n = O(n)。

 

17.3-7 设计一个数据结构来支持整数动态多重集合S上的下列两个操作: 

   INSERT(S, x) 将x插入到S中。

   DELETE-LARGER-HALF(S) 删除S中最大的ceil(|S|/2)个元素。

 解释如何实现这个数据结构,使得任意m个操作的序列在O(m)时间内运行,而且要在O(|S|)时间内输出S的元素。

       解:用无序数组即可实现该数据结构。在无序数组中INSERT(S,x)的时间为O(1),DELETE-LARGER-HALF(S),先用划分的方法找到S的中位数,然后删除最大的|S|/2个元素,时间为O(n)。可用记账法分析这个过程,插入一个元素收取3元费用,其中1元付给插入操作。删除操作每个元素付1元,然后将删除部分元素的余款分配到剩余的元素上。这样数组中每个元素始终有2元存款。所以任意m个操作序列可以在O(m)时间内运行。

 

17-1 使二叉查找动态化

  解:1) 最坏情况下需要在每个数组中寻找相应的元素,因此时间复杂度是O(klgn) = O(lg2n)。

    2) 最坏情况下n = 2- 1,这时候插入一个元素需要合并所有k个数组中的元素,总的时间复杂度为O(n)。平摊分析:可使用记账法,每插入一个元素付k元,其中1元作为插入费用,剩余k-1元作为合并费用,平摊运行时间为O(klgn) = O(lgn)。

    3) DELETE(x)

      1. 找最小的j 是A是满的,设y为Aj 中的最小元素时间O(lgn)。

      2. 寻找x所在的数组Ai ,时间O(lgn)

      3. 删除x,在A的合适位置放置y,最坏情况下时间复杂度O(n)。

        4. 将Ai 分解为1, 2, 4……2j-1 个元素的集合,分别插入到相应的数组。最坏情况下O(n)。

     所以DELETE(x) 时间复杂度为O(n)。

转载于:https://www.cnblogs.com/meteorgan/archive/2012/05/02/2476068.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值