平摊分析 (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
  • 6004

amortized analysis_平摊分析

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

算法和结构化数据初识

引用Quora上的回答   I see it time and again in Google interviews or new-grad hires: The way data structur...
  • ShareUs
  • ShareUs
  • 2016年05月29日 11:57
  • 376

平摊分析(Amortize Analysis)

对于一个操作的序列来讲,平摊分析(Amortize Analysis)得出的是在特定问题中这个序列下每个操作的平摊开销。   一个操作序列中,可能存在一、两个开销比较大的操作,在一般地分析下,如...

平摊分析(算法导论)

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

平摊分析 --- 算法导论读书笔记

我们经常会说一个算法快不快,这个可以由实验得出,也可以通过分析复杂度得出。实验需要大量不同的输入才更全面准确,否则片面地看某个输入下的表现,是比较偏颇的。分析复杂度(通常分析最坏,因为平均涉及输入的概...

算法导论——lec 12 平摊分析与优先队列

在平摊分析中,执行一系列数据结构操作所需要的时间是通过对执行的所有操作求平均得出,反映在任何情况下(即最坏情况下),每个操作具有平均性能。掌握了平摊分析主要有三种方法,聚集分析、记账方法、势能方法。掌...

平摊分析

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

分摊分析介绍

/* 分摊分析  聚类方法  最坏情形下,一系列操作总的代价上界除以操作个数,就是每个操作的分摊代价。 这里每个操作的分摊代价相同。 例子 二进制计数器 INC(A)  i = ...

影响计算机算法世界的十位大师

伟大的智者——Don E.Knuth 中文名:高德纳(1938-) 算法和程序设计技术的先驱者。 Oh,God!一些国外网站这样评价他。一般说来,不知道此人的程序员是不可 原谅的。其经典著作《计算机...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:平摊分析 (amortized analysis) -算法导论学习笔记
举报原因:
原因补充:

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