聚合分析

概述

聚合分析(Aggregate Analysis)是摊还分析中最直接的方法,通过对 个操作的总代价 确定一个上界,然后将总代价均摊到每个操作上,得到每个操作的摊还代价为 。在聚合分析中,所有操作被分配相同的摊还代价

定义

聚合分析

给定数据结构上的 个操作序列,聚合分析分两步进行:

  1. 确定总代价的上界:
  2. 每个操作的摊还代价为:

其中 是总代价的渐近上界函数。所有操作共享相同的摊还代价

核心性质

  1. 统一摊还代价:所有操作类型被分配相同的摊还代价,不区分不同操作的代价差异。这是聚合分析与记账方法、势能方法的关键区别。
  2. 直接求和:核心思路是找到操作序列中”昂贵操作”被”廉价操作”补贴的规律,通过全局计数证明总代价有紧界。
  3. 分析简单直观:三种摊还分析方法中,聚合分析通常是最容易理解和应用的,适合操作类型单一或代价差异不大的场景。
  4. 无法区分操作类型:当不同操作的实际代价差异很大时,聚合分析可能给出不够紧的界,因为它对所有操作一视同仁。

经典例子

栈操作(MULTIPOP)

考虑一个栈,支持三种操作:

  • PUSH(S, x):将元素 压入栈 ,代价
  • POP(S):弹出栈顶元素,代价
  • MULTIPOP(S, k):连续弹出栈顶 个元素,代价

分析:在一个由 PUSHPOPMULTIPOP 组成的操作序列中,每个元素最多被压入一次。因此,POPMULTIPOP 的总弹出次数==不超过 PUSH 的总次数 ==。

每个操作的摊还代价为

二进制计数器

考虑一个 位二进制计数器,初始值为 0,支持 INCREMENT 操作(加 1)。

分析INCREMENT 翻转的位数等于从最低位起连续 1 的个数加 1。观察规律:

  • 位(从 0 开始)在 INCREMENT 中最多翻转
  • 总翻转次数:

因此 INCREMENT 的总代价为 ,每次操作的摊还代价为

局限性

  • 无法区分操作类型:当序列中存在多种操作且代价差异大时,统一摊还代价可能掩盖某些操作的昂贵性
  • 上界可能不够紧:相比记账方法和势能方法,聚合分析有时只能给出较松的界
  • 灵活性最低:三种方法中,聚合分析的灵活性最弱,无法为不同操作分配不同的摊还代价

不相交集合链表表示(加权合并)

不相交集合数据结构 的链表表示中,使用 加权合并启发式 后, 次 MAKE-SET + UNION 操作的总代价上界为

分析:每个对象最多被移动到新列表头部 次(因为每次合并后所在集合大小至少翻倍),因此 个对象的总移动次数为 。加上 次 MAKE-SET 的 代价,总代价为 ,每次操作摊还 (当 时)。

参见