平摊分析 (amortized analysis) -算法导论学习笔记

原创 2007年07月18日 02:09:00

http://freelet.blogspot.com/2008/12/amortized-analysis.html


在平摊分析中,执行一系列数据结构操作所需要的时间是通过执行的所有操作求平均而得出的。平摊分析可以用来证明在一系列操作中,通过对所有操作求平均之后,即使其中单一的操作具有较大的代价,平均代价还是很小的。

平摊分析不牵涉到概率, 平摊分析保证在最坏情况下,每个操作具有的平均性能。

三中最常用的技术:

1.聚集分析(aggregate analysis)

 证明对所有的n n个操作所构成的序列的总时间在最坏情况下为T(n)

例子:

栈操作

PUSH(S, x):x压入S

POPS):弹出栈顶

MULTIPOPS, k):弹出栈顶k个对象

nPUSH POPMULTIPOP操作序列,其作用于一个初始为空的栈。

分析:每个操作的最坏情况时间是On. 因此n个操作的序列的代价是O (n2)

虽然这一分析正确,但这个界不够紧确,利用聚集分析,可以获得更好的上界。

一个对象在每次被压入栈后,至多被弹出一次。所以,调用POP(包括MULTIPOP)的次数至多等于PUSH的次数,即至多为n.。对任意的n,包含nPUSH, POP, MULTIPOP操作的序列的总时间为O(n). 每个操作的平均代价为O(n) / n = O(1). 聚集分析中,将每个操作的平摊代价指派为平均代价。所以三个栈操作的平摊代价都是O(1)

 

2.记帐方法

在平摊分析的记帐方法中,对不同的操作赋予不同的费用,某些操作的费用比它们的实际代价或多或少。

我们对一个操作的收费的数量称为平摊代价。当一个操作的平摊代价超过了它的实际代价时,两者的差值就被当作存款(credit),并赋予数据结构中的一些特定对象,可以用来补偿那些平摊代价低于其实际代价的操作。这种方法与聚集分析不同的是,对后者,所有操作都具有相同的平摊代价。

数据结构中存储的总存款等于总的平摊代价和总的实际代价之差。注意:总存款不能是负的。

 

例子:栈操作

实际代价:

PUSH             1

POP               1

MULTIPOP    min(k, s)

现在对它们赋予以下的平摊代价:

PUSH:           2

POP:            0

MULTIPOP    0

假设用1元钱来表示代价的单位。开始时栈时空的。

栈数据结构与餐厅中一堆叠放的盘子类似。当把一个盘子压入栈时,用1元钱来支付该动作的实际代价,还有1元的存款,将其放在盘子的顶上。盘子上面的钱时用来预付将盘子从栈中弹出所需代价的。当执行一个POP操作时,对该操作不收取任何费用,只需用盘中存放的存款来支付其实际代价即可。同理,也无需对MULTIPOP收取任何费用。

因为栈上的每个盘子上面都有1元钱,而且栈中总有非负个数的盘子。这就保证了存款的总量总是非负的。这样,对任意的包含nPUSH, POP, MULTIPOP操作的序列,总的平摊代价就是总的实际代价的一个上界。总的平摊代价为O(n), 故总的实际代价也为O(n).

 

3.势能方法

在平摊分析中,势能方法(potential  method)不是将已预付的工作作为存在数据结构特定对象中存款来表示,而是表示成一 种“势能”或“势”,它在需要时可以释放出来,以支付后面的操作。势是与整个数据结构而不是其中的个别对象发生联系的。

对一个初始数据结构D0 执行n个操作。对每个i,设ci为每个操作的实际代价,

 Di 为对数据结构Di-1执行第i个操作的结果. 势函数Φ 将每个数据结构Di 映射为一个实数Φ(Di), 即与Di相联系的势. i个操作的平摊代价ai根据势函数Φ 定义为

ai    ci   Φ(Di) Φ(Di-1)

每个操作的平摊代价为其实际代价ci加上由于该操作所增加的势。

n个操作的总的平摊代价为

ai ci Φ(Dn) Φ(D0)

如果我们能定义一个势函数Φ使得对所有n,有Φ(Dn) Φ(D0), 则总的平摊代价ai就是总的实际代价ci的一个上界。通常为了方便起见定义Φ(D0) 0

直观上看,如果第i个操作的势差Φ(Di) - Φ(Di-1)是正的,则平摊代价ai表示对第i个操作多收了费,同时数据结构的势也随之增加了。如果势差是负值,则平摊代价就表示对第i个操作的不足收费,这是通过减少势来支付该操作的实际代价。

平摊代价依赖于所选择的势函数Φ。不同的势函数可能会产生不同的平摊代价,但它们都是实际代价的上界。最佳势函数的选择取决于所需的时间界。

 

例子:栈操作

定义栈上的势函数Φ为栈中对象的个数。开始时要处理的空栈D0,且Φ(D0)0。因为栈中的对象数始终时非负的,故在第i个操作后,栈Di就具有非负的势。

Φ表示的n个操作的平摊代价的总和就表示了总的实际代价的一个上界。

现在计算各个操作的平摊代价。

如果作用于一个包含s个对象的栈上的第i个操作是PUSH

则势差为Φ(Di) Φ(Di-1) = (s+1) – s = 1

这个PUSH操作的平摊代价为ai    ci   Φ(Di) Φ(Di-1) = 1+1=2

假设栈上的第i个操作是MULTIPOP(S, k). 该操作的实际代价为min(s, k).

势差为Φ(Di) Φ(Di-1) = - min(s, k)

因此MULTIPOP操作的平摊代价为

ai    ci   Φ(Di) Φ(Di-1) min(s, k) - min(s, k) = 0

类似POP操作的平摊代价也是0

三中栈操作的每一种的平摊代价都是O(1) 这样包含n个操作的序列的总平摊代价就是O(n)。已经证明n个操作的平摊代价的总和是总的实际代价的一个上界。所以n个操作的最坏情况代价为O(n).

 

例子:

动态表,当向满的表插入一项时,将表扩大一倍,但当删除一项而引起表不足1/4满时(不是1/2),就将表缩写为原来的一半

可以利用平摊分析,证明插入和删除操作的平摊代价均为O(1).

 



算法课笔记系列(七)—— 平摊分析Amortized Analysis

本周的内容是Amortized Analysis,是对算法复杂度的另一种分析。它的基本概念是,给定一连串操作,大部分的操作是非常廉价的,有极少的操作可能非常昂贵,因此一个标准的最坏分析可能过于消极了。...
  • Ying_Xu
  • Ying_Xu
  • 2016年05月17日 09:41
  • 7545

Amortized Analysis 摊还分析

Amortized Analysis摊还分析考察一个操作序列中所执行的所有操作的平均时间,来评价操作的代价。这个操作序列中也许某一操作的代价很高,但因为还有其他操作,所以这些操作的平均代价并没有那么高...
  • Woolseyyy
  • Woolseyyy
  • 2016年05月27日 15:58
  • 850

平摊分析(Amortized analysis)

今天我们主要讨论所谓的平摊分析(amortized analysis),它是用来分析一系列操作的平均所需要的代价。可能有人会问它利用概率论的知识,通过概率来求平均情况。答案是否定的,它并不涉及概率。在...
  • yzf0011
  • yzf0011
  • 2017年03月17日 11:06
  • 278

平摊分析(算法导论)

1.平摊分析是什么 平摊分析是一种算法分析的手法,其主要思路是:对若干条指令(通常O(n)条)整体进行考虑其时间复杂度(以获得更接近实际情况的时间复杂度),而不是逐一考虑执行每条指令所需的时间复杂度...
  • ChinaJane163
  • ChinaJane163
  • 2015年11月02日 11:37
  • 3581

平摊分析(Amortize Analysis)

对于一个操作的序列来讲,平摊分析(Amortize Analysis)得出的是在特定问题中这个序列下每个操作的平摊开销。   一个操作序列中,可能存在一、两个开销比较大的操作,在一般地分析下,如...
  • u013249689
  • u013249689
  • 2013年12月24日 02:32
  • 608

算法导论之平摊分析(动态表)

平摊分析,amortizedanalysis,对数据结构执行的所有操作的总和时间是油由求平均而得出,用来证明一系列操作中,通过对所有操作求平均代价,即时某一操作具有较大代价,但平均代价还是小的。导论中...
  • fjssharpsword
  • fjssharpsword
  • 2016年07月18日 09:52
  • 2415

平摊分析

平摊分析  首先解释一下平摊分析的目的,之所以会有平摊分析是因为在很多算法或数据结构操作中我们直观的或用一般的方法计算出来的时间上界不够紧凑(也就是估大了),这是因为在一系列的数据结构操作中,有的操...
  • ustcqi
  • ustcqi
  • 2013年01月06日 20:36
  • 1223

平摊分析

我们经常在处理数据结构的时间复杂度的时候,大多数操作代价很低,可是由于某些个别操作的代价较高,导致最后求得时间复杂度的上界不是那么的紧凑。在平摊分析中,执行一系列数据结构操作所需要的时间是通过对执行的...
  • sustliangbo
  • sustliangbo
  • 2013年08月12日 00:07
  • 3048

Loki的SingletonHolder解析

不得不说说Loki这个库还是相当厉害的,采用模板的方式实现了很多的设计模式,例如单体模式、策略模式、访问者模式、工厂模式等。下面从Loki库入门的设计模式介绍一下, Loki的单体模板类设计的非常强...
  • davidsu33
  • davidsu33
  • 2014年03月31日 16:45
  • 1290

平摊分析 (amortized analysis) -算法导论学习笔记

http://freelet.blogspot.com/2008/12/amortized-analysis.html在平摊分析中,执行一系列数据结构操作所需要的时间是通过执行的所有操作求平均而得出的...
  • touzani
  • touzani
  • 2007年07月18日 02:09
  • 22971
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:平摊分析 (amortized analysis) -算法导论学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)