保序回归问题学习笔记
保序回归问题
发现好像保序回归鸽了太久了,总是被喜欢保序回归的 暴虐,悟一下论文
问题描述
给定正整数 ,和一张偏序关系形成的 ,和代价函数 ,其中如果 能到达 ,则有 的偏序关系
求点值序列 ,满足对于点对 满足 ,均有 ,最小化回归代价:
对于相同的 ,统称 问题
约定
- 称"将序列 中不大于 的元素变为 ,不小于 的元素变成 "为将序列 向集合 取整
- 称点集 的 均值为满足最小化 或 的 值
特殊情形下的做法
贪心算法——例1 Approximation
给定长度为 的正整数序列 ,求单调不减的实数序列 ,最小化 。
引理 1:点集 的 均值为其加权平均数
证明:运用导数易证
引理 2:,若有 ,那么最优解中一定满足
证明见论文
有了上述两个引理算法就很 naive 了
我们只需要把 的 全部合并到一起用 均值即可
具体实现可以使用单调栈,时间复杂度
事实上,这样的做法可以扩展到 ,只需将 均值改成 均值即可
但是这个做法无法推广到一般的偏序结构上,因为引理2不再成立
维护折线算法——例2 「2018 集训队互测 Day 2」有向图
给定一个 个点 条边的有向弱连通图 ,每个点均有点权 和修改耗时 。
对于每个 ,每次修改可以花费 的时间把 加 或减 ,求最少消耗多少时间,使得 。
题目等价于偏序集为一棵树的 问题,即最小化
容易想到树形 dp
首先, 的取值一定在集合 中,记 表示集合 中第 小的元素
设 表示 且将边看成无向边时,最小的
动态规划的转移可以根据子边的指向利用 来转移
引理: 均为斜率单调不降的折线
证明:对于叶子节点 ,显然满足
对于任意节点 ,其 可以由其所有子节点的 或 以及折线 叠加得到
而 为将 斜率大于 的部分变成 , 为将 斜率小于 的部分变成
所以可以归纳地证明结论
可以用线段树维护折线 的每一段,显然折线的分界点在集合 中
运用线段树合并即可实现此问题,时间复杂度
我们发现维护折线的做法仍然无法向一般的偏序结构上扩展,瓶颈在于需要整张图的偏序结构支持自底向上的 dp
一般问题的做法
整体二分法
考虑在 问题的基础上构造一个新的 问题:
在满足原问题的所有限制条件下还满足限制 ,最小化回归代价
的情况
引理:在 问题中,如果任意 均不在区间 内,且存在一个最优解序列 满足其 元素 均不在区间 内,若 为 问题的一组最优解,那么一定存在 是原问题的一组最优解且 可以通过向 取整得到 。
证明见论文
根据引理,通过一组 问题的最优解,可以知道某一组原问题最优解中 与 的大小关系
对于 问题,最优解 一定在 中,故只需要在该集合上做整体二分:
当二分到区间 时,计算 问题的最优解,即可将节点划分到左右两边
这样对于每个节点,仅需 层计算即可确定选值
的情况
引理 1:当 时,任意集合 的 均值是唯一的
证明:求导证明导函数单调性和至少有一个零点即可,具体证明见论文
引理 2:如果 的任意非空子集的 均值均不在区间 内,且存在最优解 满足其元素 也均不在 内。若 为相同偏序集上代价函数为 的 问题的一组最优解:
存在 是原问题的一组最优解,满足 当且仅当 。
证明见论文
根据引理1,最优解中的元素和所有的 均值的并集为有限集,故对于任意 ,一定存在 ,满足区间 中不存在上述元素
考虑到引理2中的 直接做是一个浮点数,可能有精度问题,我们可以把所有 除以
则 取 或 的导数即可,注意第二种式子可能需要带负号
套用 的做法,改成实数上整体二分即可
对于 取值为整数的情况下,可以参考 [省选联考 2020 A 卷] 魔法商店
建立网络流模型
对于 上的 问题,可以看作一个 决策问题,而 的限制可以看作 选 时 也得选
这样问题就变为了经典的最小权闭合子图问题,可以用网络流解决
例3 ExtremeSpanningTrees
给定一张 个点 条边的无向连通图 和边集 ,每条边有初始的权值 ,每次操作可以把一条边的权值加 或减 ,求通过最少多少次操作可以满足:
- 边集 组成的子图是整张图的最小生成树
- 边集 组成的子图是整张图的最大生成树
可以对 条边建立偏序关系,计算生成树中非树边和其对应树上路径中的树边的偏序关系
之后问题转化为一般偏序集上的 问题
特殊偏序结构上的优化
树上问题
对于类似例2的偏序集为树形的保序回归问题,可以在整体二分的基础上套用线性的树形 dp 来解决 问题
特别的是,该算法能够扩展到仙人掌上,在环上 dp 时只用枚举一个点的 选值,破环成链即可
时间复杂度为 (忽略了计算 的复杂度)
多维偏序
未施工
问题的算法
二分法
由于 问题要求最小化 ,想到二分答案
每次二分后可以确定每个点的选值范围,然后在 上 dp
计算每个点在考虑完所有其后继节点后 的最小值并检查其是否可行
时间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现