《算法导论》Ch.17_学习笔记
<摊还分析>
摊还分析:求数据结构的一个操作序列中所执行的所有操作的平均时间来评价操作的代价。
17.1聚合分析
聚合分析中,对所有n,一个n个操作的序列最坏情况下花费的总时间为T(n)。因此在最坏情况下,每个操作的平均代价,或摊还代价为T(n)/n。
17.2核算法
对不同操作赋予不同费用,该费用称为“摊还代价”。赋予某些操作的费用可能多于或少于其实际代价。当一个操作的摊还代价超出其实际代价时,将差额存入数据结构中的特定对象,存入的差额称为“信用”。对于后续摊还代价小于实际代价的情况,信用可以用来支付差额。
17.3势能法
势能法摊还分析将预付代价表示为“势能”,简称为“势”,将势能释放出来即可用来支付未来操作的代价。
势能法工作方式如下:
对一个初始数据结构执行n个操作。对每个
,令
为第i个操作的实际代价,另
为在数据结构上执行第i个操作得到的结果数据结构。势函数
将每个数据结构映射到一个实数
,此值即为关联到数据结构
的势。第i个操作的摊还代价
用势函数定义为:
每个操作的摊还代价等于其实际代价加上此操作引起的势能变化,n个操作的总摊还代价为
17.4 动态表
非空表T的装载因子定义为表中存储的数据项的数量除以表的规模(槽的数量)。
赋予空表(没有数据项)的规模为0,其装载因子定义为1。如果一个动态表的装载因子被限定在一个常量之下,则其空闲空间相对于总空间的比例永远不会超过一个常数。
17.4.1 表扩张
扩张表的前提条件:
- 表的存储空间是一个槽的数组。
- 所有槽已被使用,装载因子为1。
- 提供内存管理系统,根据要求分配和释放内存块。
对此,常用的分配新表的启发式策略是:为新表分配2倍于旧表的槽。
n个操作总运行时间的上界,单一操作的摊还代价至多为3:将它插入表中,当表扩张时移动它,当表扩张时移动另一个已经移动过一次的数据项。—具体可以通过核算法、势能法来具体分析。
17.4.2 表扩张和收缩
当表中的数据项下降得太少时,分配一个更小得表,然后将数据项从旧表复制到新表中。释放旧表占用得内存空间,将其归还内存管理系统。理想情况下,保持两个性质:
- 动态表的装载因子有一个正的常数的下界。
- 一个表操作的摊还代价有一个常数上界。
*由于每个操作的摊还代价的上界是一个常数,在一个动态表上执行任意n个操作的实际运行时间是。