《算法导论》笔记(11) 摊还分析 部分习题

习题11.1-3 i为2的幂时代价为i,其余代价为1,聚合分析(1+2+1+4+1+1+1+8.....)/n,若n趋近无穷大,极限为3。每次操作摊还代价为3.

习题11.2-2 核算法解上题。在i/2+1到第i-1次操作之间,每次操作实际代价1,信用2,经过i/2次之后,累积信用为i,第i个操作一次性付出代价i,消耗信用为i-1,若n足够大,可知每个操作的摊还代价为3。

习题11.3-2 势能法解上题。定义势函数Φ(Di)=2i,从第i/2个操作到第i个操作,每次实际代价1,势总共增加了i,第i个操作付出代价i,降低势到了1。当n足够大,每次操作摊还代价为3。

习题11.3-3 n个元素的二叉最小堆的摊还分析。Φ(Di)= Σ lg(i)。则第i个元素的插入操作的摊还代价为O(lg(i)),第i个元素的删除操作摊还代价为O(1).

习题11.3-6 两个普通的栈实现一个队列,出入操作摊还代价为O(1)。通常用两个栈实现一个队列的方法是将栈里的元素来回倒,但是全部元素从一个栈倒入另一个栈的代价是O(n),所以我们不能频繁的来回倒。应该是在必要的时候才倒。stackA, stackB分别是两个栈,enqueue操作实际放在stackA, dequeue操作放在stackB,dequeue时若stackB为空,则将stackA元素倒入stackB。定义势能Φ(Di)=A.length,每个enqueue操作实际代价1,增加势能1,当B清空时,A的元素全部倒入B,势能为0.所以enqueue和dequeue的摊还代价都为O(1)。

enqueue(x){
  A.push(x);
}
dequeue(){
  if(B.empty() ){
    if( A.empty() ) { throw error; }
    do { B.push(A.pop() ); } while(!A.empty() )
  }
  return B.pop();
}


习题11.3-7 计数排序。势函数为Φ(T)=c*S.size,插入时实际代价为O(1),势增长c,删除一半的元素时,势减少一半,代价为O(|s| )。全部删除后,势为0。 所以插入、删除的摊还代价为O(1),而输出所有元素的代价为O(|s|)。

insert(x){
  S[x]++; sum++; update largest_element;
}
delete_half(S){
  k=sum/2; sum-=k; i=largest_element;
  while(k!=0 ){  
    while(S[i] && k!=0) {S[i]--; k--; }
    i--;
  }
  update largest_element;
}


习题17.4-1 动态开地址散列表的摊还分析。势函数Φ(D) = (1+1/a)*T.n-T.size。当n=size*a时,势为T.size,此时将表格扩张一倍,旧表复制到新表,消耗代价为T.n,势回到0.所以,每次插入操作的摊还代价是O(1)。

思考题17-2 search时也是按照2分,需要有一个将整个数组上的序数m映射到数组Ai中第j个元素的方法。根据n的二进制,从Ak-1第1个元素开始查找,向前查找则跳到Ak-2的第一个元素,向后查找则是Ak-1中间位置的元素。最坏运行时间仍然是O(lg n )。插入t时,找到应该插入的Ai的j位置,但是有可能从Ai开始向前一个子数组Ai-1移动一个数字,如果子数组都用链表实现,包括移动元素与链表的合并与分拆,最多需要O(lg n )。删除也是一样,找到Ai的位置j,删除,如果需要则链表合并与分拆,最坏情况为O(lg n )。

思考题17-3 定义两个方法,left_element(),right_element(),分别返回x结点左、右侧数值最接近x的元素。当左边需要向右调整时,将x.left_element()移动到x的位置,x移动到x.right_element()的右侧。然后对移动后的子树从底向上调整平衡。最坏的性能是O(x.size),因为移动一次就将x的左右子树调节一次,而对子树的递归操作最坏情况下会导致对所有结点都调整一次。

势函数Φ(T)=c Σ | x.left.size-x.right.size |,1/2平衡树所有的Δx都为0。m个结点加入a为参数的平衡树,重建成本为O(T.size),势至少是C*( a*size-(1-a)*size ),则有c*(2a-1)size > n* size,c > 1 / (2a-1)才能使插入的摊还时间为O(1)。

插入成本lg n, 不需调整的情况下插入的路径上的根结点Δx变化+/-1,势增量O(lg n ),而需要调整的情况下,势增量O(lg n )+ O(size )减去调整开销O(size )。则摊还成本为O(lg n )。删除操作也是同理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值