码迷,mamicode.com
首页 > 其他好文 > 详细

平摊分析的应用

时间:2020-06-21 18:01:17      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:code   fir   说明   时间   -o   info   height   pop   设计   

平摊分析在使用时灵活性和技巧性较强,下面通过几个例子来说明具体使用

【队列的栈实现】

  • 问题定义:使用栈实现队列:入队和出队的操作,并分析他的时间代价
  • 队列的栈实现方法:

技术图片

使用如图的两个栈实现:

push:S2.push    ---O(1)

pop:若S1不空,S1.pop ;    ---O(1) 

         若S1空,将S2拷贝到S1后pop;     ---O(| S2 | + 1)

  • 时间代价分析:

设计势函数:| S2 |

(1)第 i 次操作为push:

平摊代价 = 2

(2)第 i 次操作为pop,且S1不空

平摊代价 = 1

(3)第 i 次操作为pop,且S1为空

实际代价:|S2| + 1

势差:- |S2|

平摊代价=1

总代价:O(2n)

【双端队列】

  • 问题定义:用栈实现双端队列(可以插入最后或最前位置,可以删除最后或最前位置)
  • 双端队列的实现:

技术图片

                                                          技术图片

 

 

若设计成之前一样完全拷贝的方式,如果不断重复执行popfirst操作将不断拷贝,时间代价很高,不妨设计成不完全拷贝的方式

pushfirst:S1.push

pushlast:S2.push

popfirst:若S1不空:S1.pop

               若S1为空:复制S2的一半到S1中再pop      --O(|S2| + 1)

poplast:若S2不空:S2.pop

                                              若S2为空:复制S1的一半到S2中再pop     --O(|S1| + 1)

  • 时间代价分析

设计势函数:| |S2| - |S1| |

(1)第 i 次操作未进行拷贝

平摊代价:O(2)

(2)第 i 次操作进行了拷贝

实际代价:O(|Si | + 1)

势差:-|Si|

平摊代价:O(1)

总时间代价O(2n)

 

 

 

平摊分析的应用

标签:code   fir   说明   时间   -o   info   height   pop   设计   

原文地址:https://www.cnblogs.com/duanshuai/p/13173227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!