聚合分析
概述
聚合分析(Aggregate Analysis)是摊还分析中最直接的方法,通过对 个操作的总代价 确定一个上界,然后将总代价均摊到每个操作上,得到每个操作的摊还代价为 。在聚合分析中,所有操作被分配相同的摊还代价。
定义
聚合分析
给定数据结构上的 个操作序列,聚合分析分两步进行:
- 确定总代价的上界:
- 每个操作的摊还代价为:
其中 是总代价的渐近上界函数。所有操作共享相同的摊还代价 。
核心性质
- 统一摊还代价:所有操作类型被分配相同的摊还代价,不区分不同操作的代价差异。这是聚合分析与记账方法、势能方法的关键区别。
- 直接求和:核心思路是找到操作序列中”昂贵操作”被”廉价操作”补贴的规律,通过全局计数证明总代价有紧界。
- 分析简单直观:三种摊还分析方法中,聚合分析通常是最容易理解和应用的,适合操作类型单一或代价差异不大的场景。
- 无法区分操作类型:当不同操作的实际代价差异很大时,聚合分析可能给出不够紧的界,因为它对所有操作一视同仁。
经典例子
栈操作(MULTIPOP)
考虑一个栈,支持三种操作:
PUSH(S, x):将元素 压入栈 ,代价POP(S):弹出栈顶元素,代价MULTIPOP(S, k):连续弹出栈顶 个元素,代价
分析:在一个由 个 PUSH、POP、MULTIPOP 组成的操作序列中,每个元素最多被压入一次。因此,POP 和 MULTIPOP 的总弹出次数==不超过 PUSH 的总次数 ==。
每个操作的摊还代价为 。
二进制计数器
考虑一个 位二进制计数器,初始值为 0,支持 INCREMENT 操作(加 1)。
分析:INCREMENT 翻转的位数等于从最低位起连续 1 的个数加 1。观察规律:
- 第 位(从 0 开始)在 次
INCREMENT中最多翻转 次 - 总翻转次数:
因此 次 INCREMENT 的总代价为 ,每次操作的摊还代价为 。
局限性
- 无法区分操作类型:当序列中存在多种操作且代价差异大时,统一摊还代价可能掩盖某些操作的昂贵性
- 上界可能不够紧:相比记账方法和势能方法,聚合分析有时只能给出较松的界
- 灵活性最低:三种方法中,聚合分析的灵活性最弱,无法为不同操作分配不同的摊还代价
不相交集合链表表示(加权合并)
在 不相交集合数据结构 的链表表示中,使用 加权合并启发式 后, 次 MAKE-SET + UNION 操作的总代价上界为 。
分析:每个对象最多被移动到新列表头部 次(因为每次合并后所在集合大小至少翻倍),因此 个对象的总移动次数为 。加上 次 MAKE-SET 的 代价,总代价为 ,每次操作摊还 (当 时)。