关闭

[置顶] 摊还分析 聚合法

标签: 数据结构c语言
2640人阅读 评论(0) 收藏 举报
分类:

摊还分析中,求数据结构执行所有操作序列的操作时间,来评价操作的代价。如果操作序列中某个单一操作的代价很高,但是我们可以把所有操作操作代价平均一下,得到的平均代价可能是很低的。

1、聚合分析Aggregate Analyse方法(每个操作的代价)

确定n个操作的上界T(n),每个操作平摊T(n)/n。

聚合方法的原理:数据结构上共有n个操作,最坏情况下
操作1:Cost=t1
操作2:Cost=t2
操作3:Cost=t3
.
.
.
操作n:Cost=tn

T(n)=i=1nti

每个操作被赋予相同代价,不管操作类型,平摊代价T(n)/n

聚集方法实例:栈操作系列重点内容

普通栈操作及其时间代价

-Push(S,x):将对象x压入栈
-Pop(S):弹出并返回S顶端元素

以上两个操作的运行时间都是O(1),可把每个操作的实际代价视为1,n个Push和n个Pop操作系列的总代价是n,n个操作的实际运行时间为θ(n)

新的普通栈顶操作及其时间代价

操作:Multipop(S,k):
去掉S的k个栈顶对象,当|S|<k时弹出整个栈。
实现算法
MultiPop(S,k)
While not STACK-EMPTY(S) and k0 Do
Pop(S);
kk-1

Multipop(S,k)的实际代价(设Pop的代价为1):
Multipop的代价为min(|S|,k)

初始栈为空的n个栈操作序列的分析
n个栈操作序列由Push、Pop、MultiPop组成

粗略分析:
最坏情况下,每个操作都是MultiPop
每个MultiPop的代价是最坏是O(n)
操作序列的最坏代价为T(n)=O(n2)
平摊代价为T(n)/n=O(n)

精细分析:一个对象在每次被压入栈后至多被弹出一次,在非空栈上调用Pop的次数(包括在MultiPop中的调用)至多为Push执行的次数,即至多为n,最坏情况下操作序列的代价为T(n)2n=O(n)(n-1个push和1个multipop)
平摊代价=T(n)/n=O(1)

聚集方法实例2:二进制计数器
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:87203次
    • 积分:1594
    • 等级:
    • 排名:千里之外
    • 原创:72篇
    • 转载:2篇
    • 译文:0篇
    • 评论:9条
    博客专栏
    最新评论