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

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

  • 那么如何分析每一次插入操作所需的赋值次数呢?对于这个问题最简单直观的方法是用聚集方法(aggregate analysis),即不直接分析每一次的赋值次数而分析n次插入的赋值次数。
    具体分析如下:
    这里写图片描述
    观察可知
    C=i=1nCi=n+j=0lg(n1)2j3n=θ(n)
  • 第二种分析方法是会计方法(accounting argument),这个方法和第三种势能方法相对于聚集方法更加准确的分析每一步操作的平摊成本。这种方法假设自己是一个会计,对每一步操作都收取平摊费用,每次收取的平摊费用除了用于当次操作,剩下的钱存入银行,用于下一次操作,这就要保证银行的钱一直是正的。对于动态表插入问题,只需假设每一步的平摊费用是3元,其中1元用于当次赋值,1元用于下一次赋值到新表,1元用于承担旧有的项赋值到新表。同样可以得出3n的结果。方法的关键在于确定每一步的平摊费用。
  • 第三种方法是势能方法(potential function method),势能方法将会计方法中的“银行账户”定义为势能。要解释清楚这种方法先做以下假设。

    • 从数据结构 D0 开始,操作 i Di1转化为 Di
    • 每次操作的成本是 Ci
    • 定义势能函数 Φ,Φ:{Di}IR
    • Φ(D0)=0
    • Φ(Di)0
  • 那么平摊成本可以如下表示:

    Cˆi=Φ(Di)Φ(Di1)+Ci

    如果 ΔΦi>0 表示平摊成本过多,操作 i 将额外的能量存储在数据结构Di中,用于之后的操作;如果 ΔΦi<0 表示平摊成本不足,那么数据结构 Di1 中的能量就拿出来用于操作。这样就可以通过平摊成本去估计算法实际操作的成本。方法的可行性描述如下。
    i=1nCˆi=i=1n[Φ(Di)Φ(Di1)+Ci]=i=1nCi+Φ(Dn)Φ(D0)i=1nCi

    所以这个方法的关键是想办法找到问题对应的 Φ 。对于动态表它的 Φ(Di)=2i2lgi ,这个不容易想到,所以对于动态表问题,用前两种平摊分析方法优越于势能方法。

但是,在竞争分析(Competitive analysis)中,势能方法体现了强大而优美的作用,这里面以自组织表(self-organizing lists)为例,详细解释这种强大的分析方法,自组织表有点像搜索引擎的索引。本文讨论的自组织链表基于以下假设
- 一个有 n 个元素的表
- 访问元素x的成本是 rank(x) ,即 x 到表头的距离。
- 表可以通过相邻元素的移项进行重排,每次移项的成本是1。
在对表访问的时候,我们希望被访问的元素尽可能靠近表头,从而加快访问的速度,因此在每次访问某元素后都要对表格作一定的调整。那么怎样调整呢?为了方便的讨论不同方法调整的效果,下面引入两个定义。
- 在线算法(online algorithm),每次操作仅提供操作序列S中的一个操作,在线算法无法利用未来的操作信息去改进操作过程,对于自组织表问题,也即无法根据未来的访问方式调整表,只能根据当前的访问改进表。
- 离线算法(off-line algorithm),可以看到整个操作序列,从而根据每一次访问和已知的未来访问序列,产生最好的调整方法。
一个直觉的想法是,记录每个元素被访问的次数,从而使得表中的元素根据访问次数从高到低进行排序。但这样的操作似乎太费劲了。在实际引用中,一般是使用MTF策略,即每次访问一个元素 x ,访问完了之后将它移动的到表头。它的成本是2rank(x)。这种策略对局部性有很好的表现,因为通常访问都很集中。下面通过竞争分析说明这种方法的有效性。首先有以下两个定义。
- 一个在线算法是 α Competitive,如果存在常数 k ,使得算法在操作序列S上的成本 CA(S)αCopt(S)+k ,其中 Copt(S) 是最优离线算法(也加God’s algorithm)的成本。这个定义非常强大,因为它不需要对操作序列 S 作任何假设。
- Proof
假设Li是使用MTF方法,第 i 次访问后的表,Li表示使用OPT方法,第 i 次访问后的表。
Ci=2rankLi1(x)表示MTF方法在第i次操作时候的成本。 Ci=rankLi1(x)+ti 表示OPT方法在第i次操作时候的成本, ti 表示OPT方法移项的次数。下面定义针对这一问题的势能函数。

Φ(Li)=2|(x,y),xLiy and yLix|
也就是 Φ(Li)=2inversions ,即两倍的逆序对,之所以是两倍的逆序对是因为有利于后期的消项。这个势能函数满足势能函数的定义。 Φ(Li)0,Φ(L0)=0 。每一个移项对于 Φ 的改变是 ±2 。再引入以下四个集合的定义。
A={yLi1,yLi1x and yLi1x}
B={yLi1,yLi1x and yLi1x}
C={yLi1,yLi1x and yLi1x}
D={yLi1,yLi1x and yLi1x}

那么元素 x Li1 Li1 中的位置可以表示如下。
r=|A|+|B|+1
r=|A|+|C|+1

用MTF当请求访问 x 的时候生成了|A|个逆序对,消除了 |B| 个逆序对。假设当用OPT请求访问 x 的时候,进行了ti次移项,那么因为每次移项最多产生一个逆序对。所以
Φ(Li)Φ(Li1)2(|A||B|+ti)
Cˆi=Ci+Φ(Di)Φ(Di1) =2(|A|+|B|+1)+2(|A||B|+ti)  =4|A|+2ti+24(r+ti)=4Ci
因此
CMTF(S)=i=1nCi=i=1n(CˆiΦ(Di)+Φ(Di1))i=1nCˆi+Φ(L0)Φ(Li)4COPT(S)

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

参考文献:
DANIEL D. SLEATOR and ROBERT E. TARJAN, Amortized Efficiency of List Update and Paging Rules, Programming Techniques and Data Structures 202-208.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值