1 时间复杂度
1 Θ(g(n))
2 空间复杂度: 程序运行时需要额外创造的空间
2 摊销分析
1 摊还分析
- 对数据结构的一个操作序列中所执行的所有操作的平均时间,来评价操作的代价
1 聚类分析
- 证明对所有的n,由n个操作所构成的序列的总时间在最坏情况下为T(n),每一个操作的平均成本为T(n)/n;比如栈的操作,对于一个空栈的入栈和出栈的操作
2.记账方法
- 在平摊分析的记帐方法中,决定每一个操作的均摊成本,对不同的操作赋予不同的费用,某些操作的费用比它们的实际代价或多或少。我们对一个操作的收费的数量称为平摊代价。当一个操作的平摊代价超过了它的实际代价时,两者的差值就被当作存款(credit),并赋予数据结构中的一些特定对象,可以用来补偿那些平摊代价低于其实际代价的操作。这种方法与聚集分析不同的是,对后者,所有操作都具有相同的平摊代价。数据结构中存储的总存款等于总的平摊代价和总的实际代价之差。注意:总存款不能是负的。在开始阶段对于过度要价存储预先支付的存款,在后面的序列中再支付操作。比如,二进制计数器: 通过二进制触发器计算一系列数字
3.势能方法
- 在平摊分析中,势能方法(potential method)不是将已预付的工作作为存在数据结构特定对象中存款来表示,而是将存款总体上表示成一种“势能”或“势”,它在需要时可以释放出来,以支付后面的操作。势是与整个数据结构而不是其中的个别对象发生联系的。比如,动态表,可以动态改变大小的连续存储数组。
3 聚合分析
1 表的扩张
1 动态表
- whenever the table gets too full(overflows), grow it
- 创建new larger table
- 把就表的内容复制到新的表上
- free old table
4 核算法
1 cost
- n insert cost O(n)times;
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
size(i) | 1 | 2 | 4 | 4 | 8 | 8 | 8 | 8 | 16 | 16 |
cost(i) | 1 | 2 | 1 | 1 | 5 | 1 | 1 | 1 | 9 | 1 |
- cost of insert: cost(1)+… + cost(n)=n+2n<3n
- 所以n次insert花费的时间为Θ(n)
2 策略
1 charge 3 cost for insert
- pay for 立即的insert
- stored for table doubling
2 可以cover表的扩展与复制到新表的费用
charge | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
---|---|---|---|---|---|---|---|---|---|---|
bank(余额) | 1 | 2 | 2 | 4 | 2 | 4 | 6 | 8 | 2 | 4 |
- bank的费用加上下一个charge 可以cover表的扩展
5 势能法
1 势能与整个数据结构相关联
- bank count 视为potential energy of dynamic set
2 框架
- start with data structrue D_o
- 操作 i 转换为 D(i-1)-> D(i)
- cost of 操作 is ci