DP 加速 · 表格结构换来的时间与空间
动态规划的第一课是把递推写对;第二课在教材里常常只剩一句「还可以再优化」。本系列把这句话展开:DP 的加速几乎从不来自更快的代码,而来自表格自身的结构——大部分格子可以不存(滚动数组、Hirschberg 分治)、大部分格子可以不算(稀疏性)、最优决策点的位置有单调性(Knuth、Monge、SMAWK)。五页各取一种结构,每种都配「朴素 vs 优化」的同构对照与实测计数。
内容取材自 Jeff Erickson《Algorithms》的附录 D(见页尾链接),基本引擎与 序列对齐 DP、最优分段 DP 两系列衔接:编辑距离与 LCS 的填表在前者,一维分段的递推在后者,本系列在它们之上做减法。
滚动数组把空间压到 O(m+n),代价是回溯路径没了;Hirschberg 用分治把路径找回来,时间仍是 O(mn)。
省空间:滚动数组与 Hirschberg 分治
编辑距离的递推只依赖上一行,滚动数组把空间从 O(mn) 压到 O(m+n),代价是回溯路径随表一起丢掉。Hirschberg 分治用正反两遍得分行找出最优路径穿过中线的位置,在同样的空间里把路径找回来,总时间仍是 O(mn) 量级。
三种越来越强的结构假设——稀疏(多数格子不用算)、根位置单调(Knuth)、全单调(Monge / SMAWK)——各换一档复杂度。
稀疏性:只在 match point 上递推
经典 LCS 逐格填满 的表,携带信息的格子却只有 match point。本页只由匹配点重建整表:排序归并找点、 稀疏递推; 时胜过填表,字符重复多时 膨胀回 。
Knuth 单调性:最优 BST 的根不回头
最优二叉搜索树的区间 DP 每格枚举全部候选根,总计 O(n³)。Knuth 单调性把每格的枚举夹进两个邻格根之间的窗口,同一对角线望远镜求和为 O(n),总时间 O(n²):预设频率下朴素试根 120 次,窗口化 66 次。
行最小值:Monge 与 SMAWK
许多 DP 的内层是在二维数组的每一行找最小值。行最小值位置单调时,分治做到 O(m + n log m);totally monotone 矩阵上,SMAWK 做到 O(m + n),四边形不等式(Monge)是这种结构最常见的来源。
代价函数满足 Monge 时,分段 DP 的每一层就是一次行最小值问题,SMAWK 把它从平方压到线性。
落地:SMAWK 加速一维分段 DP
排序点列切成 个连续箱、最小化各箱跨度的平方和,等宽与等频分箱都不是最优,最优解是一维分段 DP。组代价 满足 Monge,每层递推化成一次隐式矩阵的行最小值,SMAWK 把 压到 。
相关链接
- Erickson — Advanced Dynamic Programming (附录 D) 本地 · D-faster-dynprog.pdf 本系列的底本:Hirschberg、稀疏 LCS、Knuth 单调性、Monge / SMAWK 与习题原文。作者标注 Unfinished,Four Russians 一节只有占位。
- Jeff Erickson — Algorithms algorithms.wtf 全书免费公开(CC BY-NC-SA 4.0),附录 D 之外的正篇第 3 章是本系列假定的前置。
- 序列对齐 DP 本站 编辑距离 / LCS 的基本填表引擎;本系列省空间与稀疏两页优化的正是那张表。
- 最优分段 DP 本站 一维分段的递推与回溯;本系列末页用 SMAWK 把它的每一层从平方压到线性。
- Hirschberg (1975) — A linear space algorithm for computing maximal common subsequences doi.org 线性空间重建最优路径的分治出处。
- Aggarwal, Klawe, Moran, Shor & Wilber (1987) — Geometric applications of a matrix-searching algorithm doi.org SMAWK 算法的出处:全单调矩阵上 O(m+n) 求全部行最小值。