Skip to content

算法Algorithm

Knuth 区间动态规划优化

Knuth optimization · Knuth–Yao optimization

在满足四边形不等式与区间单调性的区间递推中,用两段相邻子问题的最优根夹住当前最优根。

形式陈述 ​

区间动态规划常有 O(n2) 个状态,每个状态再枚举 O(n) 个分割点。Knuth 优化利用比单向决策单调更强的双边界,把总枚举量降到 O(n2)。

本页使用半开区间 [i,j) 和“选一个根后去掉根”的递推:

D[i,i]=0,D[i,j]=W(i,j)+mini≤k<j{D[i,k]+D[k+1,j]}.

W(i,j) 是与根 k 无关的区间增量,假定每项可在常数时间求值,数值加法与比较也按单位操作计费。以下设 n≥1;没有键时直接返回费用为零的空树。假定 W(i,i)=0、W 非负,并对 a≤b≤c≤d 满足

W(a,c)+W(b,d)≤W(a,d)+W(b,c),

以及区间包含单调性 W(b,c)≤W(a,d)。前者是区间版本的四点交换不等式;后者是另一个条件,不能被前者替代。

令 R[i,j] 为最小的最优根下标,则

R[i,j−1]≤R[i,j]≤R[i+1,j].

长度一的区间直接设 R[i,i+1]=i;长度至少二时,只枚举上述闭区间内的根。按区间长度递增求解,两个边界根和所有候选子区间都已经算出。

直觉

右端增加一个元素时,最佳根不会被迫向左越过原来的最左最优根;左端删掉一个元素时,最佳根也不会向左移动。这两条方向约束合在一起,把当前根夹在两个较短区间的根之间。

为什么需要增量条件?证明分两层。第一层是 Yao 的继承引理:上述 W 的四点不等式和包含单调性,使最优值 D 也满足同向的区间四点不等式。按外层区间长度归纳,取右侧两个最优区间的根;按两根的先后次序,把它们交叉用于左侧两区间。子区间的四点差由归纳假设控制,新增的 W 项由四点条件控制;两区间只在端点相接的基例则要用包含单调性。这也是不能遗漏第二个条件的原因。

第二层从 D 的四点性质推出根边界。看左边界,若 q=R[i,j] 比 p=R[i,j−1] 小,那么在旧区间里,较小的 q 必须严格劣于 p,否则违反最左规则。四点不等式给出

D[q+1,j]−D[p+1,j]≥D[q+1,j−1]−D[p+1,j−1].

加上相同的左子树差 D[i,q]−D[i,p],说明延长右端后 q 相对 p 更不可能变好,矛盾。右边界的证明对称地比较左子树;若出现平局,较小根仍由最左规则获胜。因此这份实现虽然与原论文常用的最右平局约定不同,仍保持相同方向的边界。

相邻区间夹住最优根
例子与边界

成功查找频率为 3、1、4、2 ​

给四个有序键 q0<q1<q2<q3,成功查找频率为 f=(3,1,4,2)。要构造一棵二叉搜索树,最小化“频率乘访问比较次数”的总和,根上的键算一次比较。

选根 k 后,左右子树中每次查找都会多比较一次,所以增量是

W(i,j)=∑r=ij−1fr.

非负频率保证包含单调性;四点不等式在这里恰为等式。长度一的代价为 (3,1,4,2);长度二的代价与最左根为

(D[0,2],R[0,2])=(5,0),(D[1,3],R[1,3])=(6,2),(D[2,4],R[2,4])=(8,2).

算 [1,4) 时,左右边界 R[1,3]=R[2,4]=2,只检查根 2,得到 D[1,4]=1+2+7=10。算 [0,3) 得到最优根 2、代价 13。于是整个 [0,4) 又被两个根 2 夹住,只检查

D[0,2]+D[3,4]+W(0,4)=5+2+10=17.

重建的树以 q2 为根,左孩子 q0 的右孩子为 q1,右孩子为 q3。实际加权比较次数为 4⋅1+3⋅2+1⋅3+2⋅2=17,与表值吻合。完整枚举所有区间共检查 20 个根,本例的边界优化检查 15 个;小例子的节省有限,但增长阶不同。

区间递推的外形不够 ​

矩阵链乘法也在区间中枚举切点,却含有依赖切点的乘法代价,不能直接归入这里的 W(i,j)。取矩阵维数 2×3,3×2,2×10,10×1:前三个矩阵的最佳顶层切点在第二个矩阵后,四个矩阵的最佳顶层切点却在第一个矩阵后。根向左倒退,正好破坏需要的单调性。

零频率不会破坏条件,但会产生大量平局;统一最左规则后边界仍成立。负频率则不再是查找概率或访问次数,并且可能破坏包含单调性。对新问题应逐项验证增量与边界,而不是根据几个小表的根刚好有序就套用优化。

推论与应用

固定长度 L≥2,区间 [i,i+L) 扫描的根数为

R[i+1,i+L]−R[i,i+L−1]+1.

沿 i 求和,前一项与下一段的后一项来自同一条长度 L−1 的根对角线,内部差望远镜相消,只留下两个端点和 O(n) 个常数。因此每个长度总共 O(n) 次枚举,全部长度总共 O(n2)。这不是声称每个区间只看常数个根;某个区间仍可很宽,只是同一长度的总宽度受控。

前缀和让 W 常数时间可得,表值与根表占 O(n2) 空间。根表还能递归输出整棵最优树。若只保留部分对角线却仍要任意访问左右子树费用,需另做存储分析,不能像普通分层 DP 那样直接压成两行。

分治 DP 优化依靠一层内的单向切点次序;本页依靠两个重叠区间给出的双边界,并以区间长度调度计算。辨认递推依赖的形状,才能知道该使用哪一种单调性。

参考资料
  • Donald E. Knuth, “Optimum Binary Search Trees”, Acta Informatica 1, 1971, pp. 14–25,关于最优根单调性的定理、推论与二次时间算法:论文副本。
  • F. Frances Yao, Efficient Dynamic Programming Using Quadrangle Inequalities, Xerox PARC CSL-80-4, 1980, §2 Lemmas 2.1–2.2, §3, §6:原技术报告。继承引理、根单调性、最优搜索树与矩阵链反例。
关系图谱5 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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