首页 > 其他分享 ><min/max,+>卷积与背包优化

<min/max,+>卷积与背包优化

时间:2024-10-03 20:34:37浏览次数:1  
标签:背包 log 卷积 convex le ans 优化 sim

【前置知识】

convex 与 concave:这是对于数组的概念。类比函数,下凸就是 convex,上凸就是 concave。

【<min,+>卷积问题】

考虑两个数组 \(a_{1\sim n},b_{1\sim m}\),定义它们的<min,+>卷积结果 \(c\):

  1. \(|c|=n+m\)。

  2. \(c_i=\min_{j+k=i}\{a_j+b_k\}\)。

因为普通的卷积是 \(\sum +\),形式类似。所以这种运算就叫做<min,+>卷积。<max,+>卷积的定义是类似的。

这个问题目前没有快于 \(O(nm)\) 的解法,但是在特殊情况下可以做一些优化。

【双 convex 情况】

结论:如果 \(a,b\) 都 convex,可以 \(O(n+m)\) 解决这个问题。

考虑 \(a,b\) 的差分数组 \(\Delta a,\Delta b\)。(\(\Delta a_1=a_1\),\(\Delta a_i=a_i-a_{i-1}\))
则 \(c_i\) 就是在 \(\Delta a,\Delta b\) 中最小的 \(i\) 个数之和。

容易证明,不再赘述。

【单 convex 情况】

结论:如果 \(a\) 是任意数组,\(b\) 是 convex 的,可以做到 \(O(n\log m)\) 解决。

这个情况比上面的复杂很多。我们先定义一下两个函数方便叙述。

\[f_j(x)=\{(j+i,a_j+b_i)|1\le i\le m\} \]

\[f(x)=\{(i,b_i)|1\le i\le m\} \]

观察 1:\(c_i\) 实际上等于 \(x=i\) 处,\(f_{1\sim n}(x)\) 最低点的值。
观察 2:\(f_j(x)\) 是 \(f(x)\) 的平移。

于是求 \(c\) 数组,实际上等价于求 \(f_{1\sim n}(x)\) 的下凸壳。下面讲解怎么求。

由观察 2 知 \(f_j(x)\) 与 \(f_{j'}(x)\) 最多一个交点(\(j\neq j'\) 时)。有了这个观察能做什么?

其实这里已经可以用李超线段树做了,不过李超树是 \(O(n\log^2 n)\) 的,我们像四边形不等式的队列那样,进一步优化。

维护队列 \(q\) 保存 \(i_1,i_2,\dots,i_k\),表示当前还有用的函数图像有 \(f_{i_1\sim i_k}(x)\)。现加入 \(f_j(x)\)。若 \(f_j(x)\) 与 \(f_{i_k}(x)\) 的交点在 \(f_{i_k}(x)\) 与 \(f_{i_{k-1}}(x)\) 的交点左侧,则 \(i_k\) 没有用了,可以弹出。进行完所有弹出后,假设此时队列末尾元素为 \(k\)(如果队列弹空了就直接加入 \(j\))。在 \(f_k(x)\) 有用的区间内二分,找到第一个 \(f_k(x)\le f_j(x)\) 的位置 \(pos\)。从 \(pos\) 往后,\(f_k(x)\le f_j(x)\)。

在具体实现时,除了记录 \(i_1\),还要记录它的有用区间 \([l_{i_1},r_{i_1}]\)。这和四边形不等式的二分队列是一样的。

二分带一个 \(\log m\),而函数个数是 \(n\),所以总复杂度是 \(O(n\log m)\) 的。

【背包优化】

【01 背包优化】

记总重量为 \(C\),重量种类数为 \(m\),这里给出一个 \(O(n\log n+mC\log C)\) 的做法。

把物品按重量从大到小排序,同重量按价值从大到小排序。

令 \(A_i[j]\) 表示考虑完前 \(i\) 种重量后,选一些物品总重为 \(j\) 的最大价值。

从 \(A_{i-1}\) 怎么推到 \(A_i\)?设第 \(i\) 类重量为 \(w\)。用 \(B[k]\) 表示在第 \(i\) 类中选总重为 \(kw\) 的物品(其实就是选 \(k\) 个)的最大价值。

观察发现 \(B[k]\) 是 concave 的。因为 \(B[k+1]\) 比 \(B[k]\) 选多一个物品,而且这多的一个物品必然是价值第 \(k+1\) 大的物品。再多选一个,就是第 \(k+2\) 大的了。以此类推,增长的价值必然递减。

把 \(A_{i-1}[j]\) 按 \(j\bmod w\) 的余数分类,每一类单独与 \(B\) 做<max,+>卷积,就能得到对应位置的 \(A_{i}[j]\)。每一类 \(A\) 的长度是 \(\dfrac{C}{w}\),\(B\) 的长度是 \(w\),一共做 \(w\) 次(余数分 \(w\) 类)。所以复杂度是 \(O(\dfrac{C}{w}\log w\cdot w)=O(C\log w)=O(C\log C)\)。

注意这里不能直接把 \(B\) 拓展到长度为 \(C\) 的数组,然后拿这个拓展后的数组卷。因为拓展后 \(B\) 显然就不 concave 了。

一共 \(m\) 种重量,所以复杂度是 \(O(mC\log C)\)。排序还有 \(O(n\log n)\)。总复杂度 \(O(n\log n+mC\log C)\)。

【完全背包优化】

这个优化和<max,+>卷积凸优化没关系。

设最大重量为 \(D\),总重 \(C\),给出一个 \(O(D^2\log C)\) 的解法。基于倍增。

令 \(ans_i\) 表示总重为 \(i\) 时的最大价值。暴力求出 \(ans_{0}\sim ans_{2D}\),复杂度 \(O(D^2)\)。

有:当 \(i>D\),\(ans_i=\max_{|j-k|\le D,j+k=i}(ans_j+ans_k)\)。

进而可以得到:\(ans_{j-D/2\sim j+D/2}\) 和 \(ans_{k-D/2\sim k+D/2}\) 做一次<max,+>卷积可以得到 \(ans_{j+k-D\sim j+k+D}\)。我们只需要 \(O(D^2)\) 的来做这个就够了。

既然 \(O(D^2)\) 可以从 \(j,k\rightarrow j+k\),那么直接倍增就可以做到 \(O(D^2\log C)\)。

标签:背包,log,卷积,convex,le,ans,优化,sim
From: https://www.cnblogs.com/FLY-lai/p/18445829

相关文章

  • 多重背包
    intw[maxn],v[maxn];//w[i]代表第i种物品价值v[i]代表体积intf[maxn][maxm];//前i种物品用了j的体积所能得到的最大价值intcnt=0;//总共拆成了多少个物品for(inti=1;i<=n;++i){intw,u,v;//价值,个数,体积cin>>w>>v>>u;intk=1;//先拆......
  • 优化大模型微调:MoLA层级专家分配策略
    人工智能咨询培训老师叶梓转载标明出处大模型(LLMs)的微调过程中,计算资源的需求巨大,这促使研究者们探索参数高效微调(PEFT)技术。低秩适应(LoRA)和专家混合模型(MoE)的结合显示出了提升性能的潜力,但大多数现有方法只是简单地在MoE框架下用LoRA适配器替换专家,并且每一层都分配相同数量......
  • 深度学习(可视化卷积核)
       可视化卷积核参数对理解卷积神经网络的工作原理、优化模型性能、提高模型泛化能力有一定帮助作用。下面以resnet18为例,可视化了部分卷积核参数。importtorchvisionfrommatplotlibimportpyplotaspltimporttorchmodel=torchvision.models.resnet18(pretrai......
  • 7、卷积神经网络基础
    1、边缘检测示例(EdgeDetectionExample)  卷积运算(convolutionaloperation)是卷积神经网络最基本的组成部分,使用边缘检测(edgedetection)作为入门样例。接下来,你会看到卷积是如何进行运算的。    在之前的人脸例子中,我们知道神经网络的前几层是如何检测边缘的,然后,后面的层......
  • 【深度学习基础模型】卷积神经网络(Convolutional Neural Networks, CNN)详细理解并附实
    【深度学习基础模型】卷积神经网络(ConvolutionalNeuralNetworks,CNN)详细理解并附实现代码。【深度学习基础模型】卷积神经网络(ConvolutionalNeuralNetworks,CNN)详细理解并附实现代码。文章目录【深度学习基础模型】卷积神经网络(ConvolutionalNeuralNetworks,......
  • 单调队列优化 DP
    单调队列可以\(O(n)\)求出子区间的最值,且顺序上要求区间的左端点和右端点单调不降。引入P1886滑动窗口/【模板】单调队列定义一个队列\(q\),我们让\(q\)中的元素满足单调不降。因此当\(x\)入队时,从前往后让不在当前范围的元素出队,从后往前将\(<x\)的元素全部出队,然......
  • unity性能优化(有关图集)
    1.什么是图集?首先,你必须把你的美术资源TextureType改为Sprite(精灵类型),因为SpriteAltas只支持Sprite这种TextureType格式。官方:2D项目使用精灵和其他图形来创建其场景的视觉效果。这意味着单个项目可能包含许多纹理文件。Unity通常会为场景中的每个纹理发出一个绘制调用;但是,......
  • 33_分布式文档系统_bulk api的奇特json格式与底层性能优化关系大揭秘
    课程大纲bulkapi奇特的json格式{"action":{"meta"}}\n{"data"}\n{"action":{"meta"}}\n{"data"}\n[{"action":{},"data":{}}]1、bulk中的每个操作都可能要转发到不同的node的shard去执行2、如果采用比较良好的......
  • 性能优化之解决路由缓存问题
    什么路由缓存问题过时的路由信息:路由器缓存的路由信息如果没有及时更新,可能会导致数据包被错误地转发到过时或不可用的路径。缓存冲突:当多个路由条目相互冲突时,可能导致路由器选择错误的路径,从而影响数据流的顺畅性。缓存溢出:如果路由器的缓存空间不足,可能会导致新的路由......
  • Linux必备优化
    Linux必备优化1.关闭selinuxkylin系统#临时关闭setenforce0#永久关闭[root@web04~]#sed-i's#SELINUX=enforcing#SELINUX=disabled#g'/etc/selinux/config#检查显示Disabled就是关闭的[root@web04~]#grepdisabled/etc/selinux/configSELINUX=disable......