保序回归问题学习笔记
保序回归问题
发现好像保序回归鸽了太久了,总是被喜欢保序回归的 \(\text{CXY07}\) 暴虐,悟一下论文
问题描述
给定正整数 \(p\),和一张偏序关系形成的 \(DAG\),和代价函数 \((y,w),w_i>0\),其中如果 \(i\) 能到达 \(j\),则有 \(v_i\leq v_j\) 的偏序关系
求点值序列 \(f\),满足对于点对 \((i,j)\) 满足 \(v_i\leq v_j\),均有 \(f_i\leq f_j\),最小化回归代价:
对于相同的 \(p\),统称 \(L_p\) 问题
约定
- 称"将序列 \(a\) 中不大于 \(l\) 的元素变为 \(l\),不小于 \(r\) 的元素变成 \(r\)"为将序列 \(a\) 向集合 \([l,r]\) 取整
- 称点集 \(S\) 的 \(L_p\) 均值为满足最小化 \(\sum_{i=1}^nw_i|v-y_i|^p,p\in[1,+\infty)\) 或 \(\max\{w_i|v-y_i|\},p=+\infty\) 的 \(v\) 值
特殊情形下的做法
贪心算法——例1 Approximation
给定长度为 \(n\) 的正整数序列 \(y,w\) ,求单调不减的实数序列 \(f\) ,最小化 \(\sum_{i=1}^nw_i(f_i-y_i)^2\) 。
\(n\leq 2\times 10^5\)
引理 1:点集 \(S\) 的 \(L_2\) 均值为其加权平均数 \(\dfrac{\sum_{i\in S}w_iy_i}{\sum_{i\in S}w_i}\)
证明:运用导数易证
引理 2:\(\forall 1\leq i<n\),若有 \(y_i>y_{i+1}\),那么最优解中一定满足 \(f_i=f_{i+1}\)
证明见论文
有了上述两个引理算法就很 naive 了
我们只需要把 \(y_i>y_{i+1}\) 的 \(i\) 全部合并到一起用 \(L_2\) 均值即可
具体实现可以使用单调栈,时间复杂度 \(O(n)\)
事实上,这样的做法可以扩展到 \(1\leq p<+\infty\),只需将 \(L_2\) 均值改成 \(L_p\) 均值即可
但是这个做法无法推广到一般的偏序结构上,因为引理2不再成立
维护折线算法——例2 「2018 集训队互测 Day 2」有向图
给定一个 \(n\) 个点 \(n−1\) 条边的有向弱连通图 \(G = (V, E)\) ,每个点均有点权 \(d_i\) 和修改耗时 \(w_i\) 。
对于每个 \(i(1\leq i\leq n)\) ,每次修改可以花费 \(w_i\) 的时间把 \(d_i\) 加 \(1\) 或减 \(1\) ,求最少消耗多少时间,使得 \(\forall(u, v)\in E,d_u ≤ d_v\) 。
\(n\leq 3\times 10^5,1\leq d_i\leq 10^9,1\leq w_i\leq 10^4\)
题目等价于偏序集为一棵树的 \(L_1\) 问题,即最小化 \(\sum_{i=1}^nw_i|f_i-d_i|\)
容易想到树形 dp
首先,\(f_i\) 的取值一定在集合 \(D=\{d_1,d_2,\dots,d_n\}\) 中,记 \(D_i\) 表示集合 \(D\) 中第 \(i\) 小的元素
设 \(f_{i,j}\) 表示 \(f_i=D_j\) 且将边看成无向边时,最小的 \(\sum_{k\in subtree(i)}w_k|f_k-d_k|\)
动态规划的转移可以根据子边的指向利用 \(P_{i,j}=\min_{k\leq j}f_{i,k},S_{i,j}=\min_{k\geq j}f_{i,k}\) 来转移
引理:\(\forall x\in [1,n],f_x,P_x,S_x\) 均为斜率单调不降的折线
证明:对于叶子节点 \(x\),显然满足
对于任意节点 \(x\) ,其 \(f_x\) 可以由其所有子节点的 \(P_x\) 或 \(S_x\) 以及折线 \(y=w_i|x−d_i|\) 叠加得到
而 \(P_x\) 为将 \(f_x\) 斜率大于 \(0\) 的部分变成 \(y=\min f_{i,j}\) , \(S_x\) 为将 \(f_x\) 斜率小于 \(0\) 的部分变成 \(y=\min f_{i, j}\)
所以可以归纳地证明结论
可以用线段树维护折线 \(f,P,S\) 的每一段,显然折线的分界点在集合 \(D\) 中
运用线段树合并即可实现此问题,时间复杂度 \(O(n\log n)\)
我们发现维护折线的做法仍然无法向一般的偏序结构上扩展,瓶颈在于需要整张图的偏序结构支持自底向上的 dp
一般问题的做法
整体二分法
考虑在 \(L_p\) 问题的基础上构造一个新的 \(S=(a,b)\) 问题:
在满足原问题的所有限制条件下还满足限制 \(a\leq f_i\leq b\),最小化回归代价
\(p=1\) 的情况
引理:在 \(L_1\) 问题中,如果任意 \(y_i\) 均不在区间 \((a,b)\) 内,且存在一个最优解序列 \(f\) 满足其 元素 \(f_i\) 均不在区间 \((a,b)\) 内,若 \(f^S\) 为 \(S\) 问题的一组最优解,那么一定存在 \(f\) 是原问题的一组最优解且 \(f\) 可以通过向 \(S\) 取整得到 \(f^S\) 。
证明见论文
根据引理,通过一组 \(S\) 问题的最优解,可以知道某一组原问题最优解中 \(f_i\) 与 \(a,b\) 的大小关系
对于 \(L_1\) 问题,最优解 \(f_i\) 一定在 \(Y=\{y_1,y_2,\dots,y_n\}\) 中,故只需要在该集合上做整体二分:
当二分到区间 \([l,r]\) 时,计算 \(S=(Y_{mid},Y_{mid+1})\) 问题的最优解,即可将节点划分到左右两边
这样对于每个节点,仅需 \(\log n\) 层计算即可确定选值
\(1<p<+\infty\) 的情况
引理 1:当 \(1<p<+\infty\) 时,任意集合 \(S\) 的 \(L_p\) 均值是唯一的
证明:求导证明导函数单调性和至少有一个零点即可,具体证明见论文
引理 2:如果 \(V\) 的任意非空子集的 \(L_p\) 均值均不在区间 \((a, b)(a<b)\) 内,且存在最优解 \(f\) 满足其元素 \(f_i\) 也均不在 \((a,b)\) 内。若 \(\hat f\) 为相同偏序集上代价函数为 \((y',w')\) 的 \(L_1\) 问题的一组最优解:
\[(y'_i,w'_i)=\left\{\begin{matrix}(0,w_i((b-y_i)^p-(a-y_i)^p)),y_i\leq a\\(1,w_i((y_i-a)^p-(y_i-b)^p)),y_i>a\end{matrix}\right. \]存在 \(f\) 是原问题的一组最优解,满足 \(\hat f_i=0\) 当且仅当 \(f_i\leq a\) 。
证明见论文
根据引理1,最优解中的元素和所有的 \(L_p\) 均值的并集为有限集,故对于任意 \(a\) ,一定存在 \(\epsilon>0\),满足区间 \((a,a+\epsilon)\) 中不存在上述元素
考虑到引理2中的 \(w'_i\) 直接做是一个浮点数,可能有精度问题,我们可以把所有 \(w'_i\) 除以 \(\epsilon\)
则 \(w'_i\) 取 \(f(x)=w_i(x-y_i)^p\) 或 \(w_i(y_i-x)^p\) 的导数即可,注意第二种式子可能需要带负号
套用 \(p=1\) 的做法,改成实数上整体二分即可
对于 \(f_i\) 取值为整数的情况下,可以参考 [省选联考 2020 A 卷] 魔法商店
建立网络流模型
对于 \(L_1\) 上的 \(S\) 问题,可以看作一个 \(0/1\) 决策问题,而 \(f_i\leq f_j\) 的限制可以看作 \(f_i\) 选 \(1\) 时 \(f_j\) 也得选 \(1\)
这样问题就变为了经典的最小权闭合子图问题,可以用网络流解决
例3 ExtremeSpanningTrees
给定一张 \(n\) 个点 \(m\) 条边的无向连通图 \(G = (V, E)\) 和边集 \(E_1,E_2(E_1,E_2\in E)\) ,每条边有初始的权值 \(d_i\) ,每次操作可以把一条边的权值加 \(1\) 或减 \(1\) ,求通过最少多少次操作可以满足:
- 边集 \(E_1\) 组成的子图是整张图的最小生成树
- 边集 \(E_2\) 组成的子图是整张图的最大生成树
\(n\leq 50,m\leq 1000\)
可以对 \(m\) 条边建立偏序关系,计算生成树中非树边和其对应树上路径中的树边的偏序关系
之后问题转化为一般偏序集上的 \(L_1\) 问题
特殊偏序结构上的优化
树上问题
对于类似例2的偏序集为树形的保序回归问题,可以在整体二分的基础上套用线性的树形 dp 来解决 \(S\) 问题
特别的是,该算法能够扩展到仙人掌上,在环上 dp 时只用枚举一个点的 \(0/1\) 选值,破环成链即可
时间复杂度为 \(O(n\log n)\)(忽略了计算 \(x^{p-1}\) 的复杂度)
多维偏序
未施工
\(L_{\infty}\) 问题的算法
二分法
由于 \(L_{\infty}\) 问题要求最小化 \(\max\),想到二分答案
每次二分后可以确定每个点的选值范围,然后在 \(DAG\) 上 dp
计算每个点在考虑完所有其后继节点后 \(f_x\) 的最小值并检查其是否可行
时间复杂度 \(O(m\log \max{y_i})\)