形式陈述
许多转移虽然要在所有旧状态中取最小,却能写成
每个候选 对应一条直线 ,系数与查询坐标都取自实数公理库实数系Real number system · Ordered complete field满足序域公理与上确界完备性的数系。。问题变成动态插入直线,并查询指定横坐标处的最低值。这里的函数是仿射函数;算法习惯把它的图像简称为线。
Convex hull trick 是利用这些直线下包络加速求最小值的方法。本页讲双单调版本:直线按斜率非增顺序插入,查询横坐标按非降顺序到来。每条线的编号按插入次序增加,平局取最早插入者。
用一个双端队列公理库双端队列Deque · Double-ended queue在同一有序序列的首尾两端都支持插入与删除的抽象数据类型。保存仍可能成为最优候选的线。插入时从队尾删除无用线;查询时从队首删除以后不会再赢的线。相同斜率只保留截距较小者,截距也相同则保留较早编号。查询非空队列时返回最小值及其编号;空结构返回无候选,费用约定为 。
对三条严格递减斜率 ,中间线冗余的判定是
分母为正,因此可以交叉相乘而不改变不等号方向。若斜率和截距为整数,下面就是整数精确判定;一般实数输入则仍需能精确比较相应乘积的表示:
直觉
斜率较大的线在左边更有优势,斜率较小的线在右边更有优势。两条不同斜率的线最多交一次,所以下包络的获胜线随 增大按斜率递减的顺序交接。
中间线要真正赢得一个区间,必须先击败第一条线,过一段以后才被第三条线击败。如果它击败第一条的交点已经不早于被第三条击败的交点,就没有独占最优的区间。两个交点重合时,它至多在那个点打平,而第一条线编号更早,仍不需要保留中间线。这解释了冗余判定中的等号及其依赖的平局约定。
队尾反复删掉冗余中间线,直到交点严格递增,再加入新线。查询时比较队首两条线在当前 的值:只有第二条严格更优时,才弹出第一条;以后查询更靠右,较低斜率的第二条优势不会逆转,弹出是永久安全的。若值相等,第一条编号更早,必须暂时保留。
删去无用线,再移动查询队首
例子与边界
一条从未获胜的线
依次插入 、、。前两条的交点是 ,后两条的交点是 。中间线还没追上第一条,就已输给第三条,因此从队尾删除 。剩下两条在 交接。
按 查询,最小值依次为 ,获胜编号为 。前两个查询都保留队首 ;到 ,,弹出 。这次弹出依靠后续横坐标不会倒退。如果下一问突然回到 ,已经删掉的 才是真正胜者,队列无法回答。
因此只有斜率单调、查询乱序时,应保留完整包络并对交接位置二分查询,而不是弹队首;斜率也乱序时,则可改用Li Chao 树公理库Li Chao 直线树Li Chao tree · Li Chao segment tree把离散查询坐标递归二分,每个结点保留中点胜者,把另一条线送往唯一仍可能获胜的半边。等结构。两种单调性负责两个不同的删线动作。
从平方费用得到直线
对非负工作量的连续分段动态规划公理库动态规划Dynamic programming在有限或良基的状态依赖上复用已计算结果的算法设计范式。,展开
得到
所以候选线的斜率 ,截距 ,查询点 。非负工作量让 非降,恰好使插入斜率非增、查询点非降。计算每个 前,先插入新合法候选 ,跳过上一层不可达的状态,再查询;不能提前插入所有 ,否则会允许未来切点影响当前状态。
示例第二层查询 时,。切点 的前缀和同为 ,给出相同直线 ,保留编号 ;切点 给出 。在 ,前者为 ,后者为 ,加回 得到费用 、切点 。相等斜率处理与 DP 最左切点约定完全一致。
交叉相乘也有数值边界
对整数系数,交叉相乘无需先把交点舍入为浮点数,但乘积可能超过输入整数的位宽。实现前应估计斜率差、截距差和乘积的最大位数,使用足够宽的整数或任意精度整数。本页核验脚本使用 Python 整数,不发生固定宽度溢出。若改用浮点容差,接近交点的平局和冗余判定就需要单独的误差分析。
推论与应用
每条线最多入队一次,从队尾或队首删除后不再回来,所以 次插入与 次单调查询总共 次队列操作和比较。这是摊还分析公理库摊还分析Amortized analysis对操作序列的总成本作上界,而非逐次最坏成本。:某次插入可能删除许多条线,但每条被删线只支付一次。空间为 ;若保存每一步整个队列用于图示,追踪日志可能额外占二次空间,不能算进同一个界。
在平方分段例中,每层至多插入、查询各 次,所以 层可做 次整数算术操作。上一层数值可用两行保存;完整回溯切点仍要另存。这里的线性是算术操作数,任意精度乘法的位成本还随整数大小增长。
几何上, 是分段线性的凹函数,其获胜斜率非增;“convex hull trick”的名字来自与直线对偶凸壳的联系,并不意味着这条最小包络本身是凸函数。算法真正使用的是一次交叉与交接顺序,而不是一个含糊的“看起来凸”。
参考资料
- UNSW COMP4128, Dynamic Programming II, 2021, “CHT Data Structure Construction”, “CHT Query Implementation”, “CHT Insert Implementation” and “Covered Walkway”, slides 16–46:官方讲义。按斜率维护包络、交点判断、单调查询与平方展开。
- CP Initiative, USACO Guide, “Convex Hull Trick”:维护者教程。双单调条件和队列实现的教学实例。