Skip to content

记忆化

Memoization

缓存递归子问题结果以避免重复计算的自顶向下动态规划技术。

条目类型
原则

形式陈述

记忆化把递归函数对参数状态 x 的结果存入表 M[x];再次遇到同一状态时直接返回。它要求子问题结果只依赖被选作键的状态信息,且依赖图无导致未定义循环,或另有固定点语义。若共有 N 个可达状态、每个状态计算转移成本至多 C,总时间通常为 O(NC),空间为 O(N) 加递归栈。它是自顶向下动态规划,与按拓扑次序填表的自底向上方法等价于同一递推。

直觉

递归树中许多分支会反复询问同一个子问题;记忆化把已经求出的输入—输出对缓存起来,将递归树折叠成状态 DAG,使同一状态再次出现时直接复用、每个节点只真正求值一次。它保留自顶向下、按需展开的控制流,只计算从初始问题可达的状态;代价是递归开销、哈希或数组查表和缓存空间。正确性依赖函数在同一状态上结果稳定,若状态遗漏了影响结果的环境,缓存会复用错误答案。

记忆化把递归树折叠成缓存 DAG
例子与边界

朴素 Fibonacci 递归重复计算 F(k),加缓存后只计算 F(0),,F(n),时间降为 O(n)。区间 DP 的键必须包含左右端点;遗漏影响结果的参数会错误合并不同状态。缓存随机或有副作用的函数可能改变语义,除非这些效应也进入键或被隔离。记忆化只访问从初始问题可达的状态,可能优于填满整个表;但哈希和递归开销可能更高。

朴素 Fibonacci 递归重复计算 F(k),时间指数;缓存每个 k 后每个状态只求一次,时间 O(n)、空间 O(n)。网格路径若状态为坐标 (i,j),障碍布局固定时可缓存;若布局会动态改变却未纳入键,旧结果失效。

含环递归可能在结果写入缓存前再次访问同一状态,导致无限递归;需三色标记、固定点迭代或改成图算法。缓存无界增长也可能比重算更昂贵,工程中常配合淘汰策略,但淘汰不应改变纯函数正确性。

推论与应用

记忆化广泛用于解析、图搜索、游戏求值和最优化递推,也是把清晰递归定义转化为高效实现的直接技术。

它是 动态规划 的自顶向下实现,函数 的输入构成状态键。与表格法相比,记忆化适合稀疏可达状态和复杂转移;解析、博弈搜索、递归下降与 DAG 计算都可通过缓存把重叠子问题降为一次求值。

Memoization 只保证每个实际到达状态计算一次;若状态空间本身为全部子集,便得到子集 DP的指数上界,而非自动多项式。树宽 DP在树分解 bag 上缓存边界赋值,复杂度指数集中在宽度。自顶向下是否访问更少状态取决于实例可达性,最坏仍需与完整状态 DAG 比较,不能把“有缓存”当复杂度证明。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Parts I–VI。
  • Jon Kleinberg and Éva Tardos, Algorithm Design, Pearson, 2005,Chs. 1–13。
关系图谱5 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

下位 / 直接特例

暂未标注直接特例。