您的位置:首页 > 其它

Amortized analysis平摊分析——记算法导论视频总结

2016-06-10 15:16 846 查看
引言:在不知道总共有多少元素的情况下,一个哈希表应该多大?一个方法是动态表dynamic table。当数据溢出的时候double表格。将原来数据移动到新表,并释放旧表。

那么如何分析每一次插入操作所需的赋值次数呢?对于这个问题最简单直观的方法是用聚集方法(aggregate analysis),即不直接分析每一次的赋值次数而分析n次插入的赋值次数。

具体分析如下:



观察可知

C=∑i=1nCi=n+∑j=0lg(n−1)2j≤3n=θ(n)C = \sum_{i=1}^{n}C_i=n+\sum_{j=0}^{lg(n-1)}2^j\leq3n=\theta(n)

第二种分析方法是会计方法(accounting argument),这个方法和第三种势能方法相对于聚集方法更加准确的分析每一步操作的平摊成本。这种方法假设自己是一个会计,对每一步操作都收取平摊费用,每次收取的平摊费用除了用于当次操作,剩下的钱存入银行,用于下一次操作,这就要保证银行的钱一直是正的。对于动态表插入问题,只需假设每一步的平摊费用是3元,其中1元用于当次赋值,1元用于下一次赋值到新表,1元用于承担旧有的项赋值到新表。同样可以得出3n的结果。方法的关键在于确定每一步的平摊费用。

第三种方法是势能方法(potential function method),势能方法将会计方法中的“银行账户”定义为势能。要解释清楚这种方法先做以下假设。

从数据结构D0D_0开始,操作ii将Di−1D_{i-1}转化为DiD_{i}

每次操作的成本是CiC_i

定义势能函数Φ,Φ:{Di}−→IR\Phi,\Phi : \{ D_i \} \xrightarrow{}{\rm I\!R}

Φ(D0)=0\Phi(D_0)=0

Φ(Di)≥0\Phi(D_i)\geq0

那么平摊成本可以如下表示:

Cˆi=Φ(Di)−Φ(Di−1)+Ci\widehat C_i = \Phi(D_i)-\Phi(D_{i-1})+C_i

如果ΔΦi>0\Delta \Phi_i > 0表示平摊成本过多,操作ii将额外的能量存储在数据结构DiD_{i}中,用于之后的操作;如果ΔΦi<0\Delta \Phi_i < 0表示平摊成本不足,那么数据结构Di−1D_{i-1}中的能量就拿出来用于操作。这样就可以通过平摊成本去估计算法实际操作的成本。方法的可行性描述如下。

∑i=1nCˆi=∑i=1n[Φ(Di)−Φ(Di−1)+Ci]=∑i=1nCi+Φ(Dn)−Φ(D0)≥∑i=1nCi\sum_{i=1}^{n}\widehat C_i = \sum_{i=1}^{n} [\Phi(D_i)-\Phi(D_{i-1})+C_i]=\sum_{i=1}^{n}C_i+\Phi(D_n)-\Phi(D_0) \geq\sum_{i=1}^{n}C_i

所以这个方法的关键是想办法找到问题对应的Φ\Phi。对于动态表它的Φ(Di)=2i−2⌈lgi⌉\Phi(D_i)=2i-2^{\lceil lg i \rceil},这个不容易想到,所以对于动态表问题,用前两种平摊分析方法优越于势能方法。

但是,在竞争分析(Competitive analysis)中,势能方法体现了强大而优美的作用,这里面以自组织表(self-organizing lists)为例,详细解释这种强大的分析方法,自组织表有点像搜索引擎的索引。本文讨论的自组织链表基于以下假设

- 一个有nn个元素的表

- 访问元素xx的成本是rank(x)rank(x),即xx到表头的距离。

- 表可以通过相邻元素的移项进行重排,每次移项的成本是1。

在对表访问的时候,我们希望被访问的元素尽可能靠近表头,从而加快访问的速度,因此在每次访问某元素后都要对表格作一定的调整。那么怎样调整呢?为了方便的讨论不同方法调整的效果,下面引入两个定义。

- 在线算法(online algorithm),每次操作仅提供操作序列SS中的一个操作,在线算法无法利用未来的操作信息去改进操作过程,对于自组织表问题,也即无法根据未来的访问方式调整表,只能根据当前的访问改进表。

- 离线算法(off-line algorithm),可以看到整个操作序列,从而根据每一次访问和已知的未来访问序列,产生最好的调整方法。

一个直觉的想法是,记录每个元素被访问的次数,从而使得表中的元素根据访问次数从高到低进行排序。但这样的操作似乎太费劲了。在实际引用中,一般是使用MTF策略,即每次访问一个元素xx,访问完了之后将它移动的到表头。它的成本是2rank(x)2rank(x)。这种策略对局部性有很好的表现,因为通常访问都很集中。下面通过竞争分析说明这种方法的有效性。首先有以下两个定义。

- 一个在线算法是α\alphaCompetitive,如果存在常数kk,使得算法在操作序列SS上的成本CA(S)≤αCopt(S)+kC_A(S) \leq \alpha C_{opt}(S)+k,其中Copt(S)C_{opt}(S)是最优离线算法(也加God’s algorithm)的成本。这个定义非常强大,因为它不需要对操作序列SS作任何假设。

- Proof

假设LiL_i是使用MTF方法,第ii次访问后的表,Li∗{L_i}^*表示使用OPT方法,第ii次访问后的表。

Ci=2rankLi−1(x)C_i=2rank_{L_{i-1}}(x)表示MTF方法在第i次操作时候的成本。Ci∗=rankLi−1∗(x)+ti{C_i}^*=rank_{{L_{i-1}}^*}(x)+t_i表示OPT方法在第i次操作时候的成本, tit_i表示OPT方法移项的次数。下面定义针对这一问题的势能函数。

Φ(Li)=2|(x,y),x≺Liy and y≻Li∗x|\Phi(L_i)=2|(x,y),x\prec _{L_i}y \ and \ y\succ _{{L_i}^*}x|也就是Φ(Li)=2inversions\Phi(L_i) = 2inversions,即两倍的逆序对,之所以是两倍的逆序对是因为有利于后期的消项。这个势能函数满足势能函数的定义。Φ(Li)≥0,Φ(L0)=0\Phi(L_i)\geq0,\Phi(L_0)=0。每一个移项对于Φ\Phi的改变是±2\pm2。再引入以下四个集合的定义。

A={y∈Li−1,y≺Li−1x and y≺Li−1∗x}A = \big \{ y\in L_{i-1}, y \prec _{L_{i-1}}x \ and \ y\prec_{{L_{i-1}}^*}x \big \}B={y∈Li−1,y≺Li−1x and y≻Li−1∗x}B = \big \{ y\in L_{i-1}, y \prec _{L_{i-1}}x \ and \ y\succ_{{L_{i-1}}^*}x \big \} C={y∈Li−1,y≻Li−1x and y≺Li−1∗x}C = \big \{ y\in L_{i-1}, y \succ _{L_{i-1}}x \ and \ y\prec_{{L_{i-1}}^*}x \big \} D={y∈Li−1,y≻Li−1x and y≻Li−1∗x}D = \big \{ y\in L_{i-1}, y \succ _{L_{i-1}}x \ and \ y\succ_{{L_{i-1}}^*}x \big \}

那么元素xx在Li−1L_{i-1}和Li−1∗{L_{i-1}}^*中的位置可以表示如下。

r=|A|+|B|+1r = |A| + |B| + 1 r∗=|A|+|C|+1r^* = |A| + |C| + 1

用MTF当请求访问xx的时候生成了|A||A|个逆序对,消除了|B||B|个逆序对。假设当用OPT请求访问xx的时候,进行了tit_i次移项,那么因为每次移项最多产生一个逆序对。所以

Φ(Li)−Φ(Li−1)≤2(|A|−|B|+ti)\Phi(L_i)-\Phi(L_{i-1}) \leq 2(|A|-|B|+t_i) Cˆi=Ci+Φ(Di)−Φ(Di−1) =2(|A|+|B|+1)+2(|A|−|B|+ti) =4|A|+2ti+2≤4(r∗+ti)=4Ci∗\widehat C_i = C_i + \Phi(D_i)-\Phi(D_{i-1}) \\ \qquad \qquad \qquad \ = 2(|A|+|B|+1)+2(|A|-|B|+t_i) \\ \qquad \quad \quad \quad \ \ =4|A|+2t_i+2 \leq 4(r^*+t_i)=4{C_i}^* 因此CMTF(S)=∑i=1nCi=∑i=1n(Cˆi−Φ(Di)+Φ(Di−1))≤∑i=1nCˆi+Φ(L0)−Φ(Li)≤4COPT(S)C_{MTF}(S)=\sum_{i=1}^{n}C_i=\sum_{i=1}^{n}(\widehat C_i - \Phi(D_i)+\Phi(D_{i-1}) ) \\ \leq \sum_{i=1}^{n} \widehat C_i +\Phi(L_0)-\Phi(L_i) \\ \leq 4C_{OPT}(S)

综上,MTF是4-competitive的。在实际应用中,将表中最后一个元素移动到表头,只要简单指针操作,因此可以认为这个操作free。在这种情况下,Sleator and Tarjan 给出了理论证明,证明此时MTF是2-Competitive的。总结:势能方法应用的关键是定义一个好的势能函数,而势能函数的定义又跟问题本身密切相关,本文中的关键应该是用逆序对去描述两个表的差异,从而引出势能函数,然后顺利的用集合去描述元素xx的位置。

参考文献:

DANIEL D. SLEATOR and ROBERT E. TARJAN, Amortized Efficiency of List Update and Paging Rules, Programming Techniques and Data Structures 202-208.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: