“若费用矩阵更强地满足全单调性,且能随机访问表项,SMAWK可以进一步把每层求值降为线性。若费用展开成直线查询,单调直线下包络也是另一条路。分治法的优点是直接使用最优切点次序,不要求每个费用都…”
形式陈述
给定
递归过程接收行列表
- 削减列。 依次读入新列
,维护列栈 。当栈非空时,取 ;若 ,弹出栈顶并继续比较,否则停止。若 ,把 入栈;若栈已满,就丢弃新列。相等时不弹旧列,保留更左的候选。 - 递归隔行。 对
这些零起算奇数位置的行,在保留列 上递归求解。 - 插值其余行。 每个偶数位置行的最优列在前后已解行的最优列之间;首尾缺邻居时用
的首尾作为边界。在这个闭区间内扫描,仍取最左最小值。
空行列表直接返回;一行也可按相同步骤处理。所有列号都保留原始顺序,递归中的局部位置只用于访问列表,不能替代输出的原列号。
直觉
削减列的关键是给每个弹出操作一份覆盖全部行的证据。按零起算位置编号,栈中第
现在若新列在第
每列至多入栈一次、弹栈一次,削减是线性的。但只削减到与行数一样多,还没有解出全部行。接着用分治只求一半行;邻近已解行会给未解行夹出很窄的扫描区间。这两步交替,既减少候选,又减少问题高度。
例子与边界
一次完整的削减和返回
取行坐标
开始依次处理列
递归只处理行
最后插值原表的偶数行:行
这里方括号中的列列表指削减后保留的列,不是把它们之间所有原列重新加入。被淘汰的列已有不可能最优的证明,插值不必把它们找回来。
线性求值不等于每个小例子都更省
示例实现未缓存重复查询,共调用接口
如果矩阵只是原表极小列非降,削列可能破坏正确性;如果取最左答案却在相等时弹旧列,会丢掉需要保留的最左极小列;如果表项求值本身需
推论与应用
削减只需
在分段 DP 中,当前层各行对应终点
非法候选的
参考资料
- Aggarwal, Klawe, Moran, Shor, Wilber, “Geometric Applications of a Matrix Searching Algorithm”, 1986 preliminary version, §IV, Lemma 4.1 and Theorems 4.2–4.3:原论文。REDUCE、隔行递归、插值和线性复杂度;期刊版 Algorithmica 2 (1987), pp. 195–208。