算法学习:动态规划

news/2024/4/25 10:30:38/文章来源:https://blog.csdn.net/weixin_41544435/article/details/127578723

14天阅读挑战赛
努力是为了不平庸~


系列文章目录

第一章 算法简介
第二章 贪心算法
第三章 分治法
第四章 动态规划


目录

  • 系列文章目录
    • 2.0兔子序列
    • 2.1动态规划基础
    • 2.2最长的公共子序列
      • 2.2.1问题描述:
      • 2.2.2分析问题&设计思路:
      • 2.2.3图解思路:
      • 2.2.4伪代码:
      • 2.2.5完整代码:
      • 2.2.6算法复杂度分析及其改进思路:

2.0兔子序列

意大利数学家斐波那契在《算盘全书》中描述了一个神奇的兔子序列、这就是著名的斐波那契序列。
假设第1个月有1对刚诞生的免子,第选人月讲入成熟期,第3个月开始生育兔子,而1对成熟的兔子每月会生1对兔子,免子永不死本…那么,由1对初生兔子开始,12个月后会有多少对兔子呢?如果是N对初生的兔子开始,M月后又会有多少对兔子呢?
第1个月,兔子①没有繁殖能力,所以还是1对。
第2个月,兔子①进入成熟期,仍然是1对。
第3个月,兔子①生了1对小负2,干是这个月共有2对(1+1=2)兔子。
第4个月,兔子①又生了1对小兔③。兔子②进入成熟期。共有3对(1+2=3)兔子。
第5个月,兔子①又生了1对小兔④,兔子②也生下了1对小兔⑤。兔子③进入成熟期。共有5对(2+3=5)兔子。
第6个月,兔子①②③各生下了1对小兔。兔子④⑤进入成熟期。新生3对兔子加上原有的5对兔子,这个月共有8对(3+5=8)兔子。

这个数列有十分明显的特点,从第3个月开始,当月的兔子数=上月兔子数+本月新生小兔子数,而本月新生的兔子正好是上上月的兔子数,即当月的兔子数=前两月兔子之和
F(n)={1,n=11,n=1F(n−1)+F(n−2),n>2F(n) = \begin{cases} 1 & ,n = 1 \\ 1 & ,n = 1 \\ F(n-1)+F(n-2) & ,n>2 \end{cases} F(n)=11F(n1)+F(n2),n=1,n=1,n>2
F(5)F(5)F(5)为例,如图:
在这里插入图片描述
从图可以看出,有大量的结点重复(子问题重叠),F(3)、F(2)、F(1)均重复计算多次。

2.1动态规划基础

百度百科中的解释,动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。说的很抽象,《趣学算法》中解释了动态规划的思想:其实也是一种分治思想,但与分治算法不同的是,分治算法是把原问题分解为若干子问题,自顶向下求解各子问题,合并子问题的解,从而得到原问题的解。动态规划也是把原问题分解为若干子问题,然后自底向上,先求解最小的子问题,把结果存储在表格中,再求解大的子问题时,直接从表格中查询小的子问题的解,避免重复计算,从而提高算法效率

要应用动态规划思想去解决问题,待分析的问题需要具有如下性质

  1. 最优子结构
    最优子结构性质是指问题的最优解包含其子问题的最优解。最优子结构是使用动态规划的最基本条件,如果不具有最优子结构性质,就不可以使用动态规划解决。
  2. 子问题重叠
    子问题重叠是指在求解子问题的过程中,有大量的子问题是重复的,那么只需要求解一次,然后把结果存储在表中,以后使用时可以直接查询,不需要再次求解。子问题重叠不是使用动态规划的必要条件,但问题存在子问题重叠更能够充分彰显动态规划的优势。

具体解题流程如下所示:

  1. 分析最优解的结构特征。
  2. 建立最优值的递归式。
  3. 自底向上计算最优解,并记录。
  4. 构造最优解。

上述的兔子序列就可以用这种方法求解,就是先求F(1)再求F(2)然后不停的求到F(n),在此就不具体叙述了。往下看另一个例子

最长的公共子序列、编辑距离、游船租赁、矩阵连乘、最优三角剖分、石子合并、0-1背包问题、最优二叉树都可以动态规划的思想,下面进行最长的公共子序列的讲解。

2.2最长的公共子序列

首先叙述解决流程,形成完整的思考流程。
首先,分析问题并想出算法的设计思路(文字叙述)。 然后,给出图解思路。 之后,编写伪代码。 最后,给出完整代码。 还有一件事,分析算法的复杂度,并思考改进思路。

2.2.1问题描述:

给定两个序列X={x1,x2,…,xm}X=\lbrace x_1,x_2,…,x_m\rbraceX={x1,x2,,xm}Y={y1,y2,…,yn}Y=\lbrace y_1,y_2,…,y_n\rbraceY={y1,y2,,yn}时,找出XXXYYY的一个最长的公共子序列。例如:X={A,B,C,B,A,D,B}X=\lbrace A,B,C,B,A,D,B\rbraceX={A,B,C,B,A,D,B}Y={B,C,B,A,A,C}Y=\lbrace B,C,B,A,A,C\rbraceY={B,C,B,A,A,C},那么最长公共子序列是{B,C,B,A}\lbrace B,C,B,A\rbrace{B,C,B,A}

如何找到最长公共子序列呢?如果使用暴力搜索方法,需要穷举XXX的所有子序列,检查每个子序列是否也是YYY的子序列,记录找到的最长公共子序列。XXX的子序列有2n2^n2n个(注意这里不要求连续,只要求递增的顺序!),因此暴力求解的方法时间复杂度为指数阶,这是我们避之不及的爆炸性时间复杂度。

2.2.2分析问题&设计思路:

这时候就需要判断能不能利用动态规划算法,分析如下,按照《趣学算法》一书中的情况讨论:

  1. 分析最优解的结构特征。
    假设已经知道Zk={z1,z2,…,zk}Z_k=\lbrace z_1,z_2,…,z_k\rbraceZk={z1,z2,,zk}Xm={x1,x2,...,xm}X_m=\lbrace x_1,x_2,...,x_m\rbraceXm={x1,x2,...,xm}Yn={y1,y2,y3,…,yn}Y_n=\lbrace y_1,y_2,y_3,…,y_n\rbraceYn={y1,y2,y3,,yn}的最长公共子序列。这个假设很重要,我们都是这样假设已经知道了最优解。那么可以分3种情况讨论。
    1)xm=yn=znx_m=y_n=z_nxm=yn=zn;那么Zk−1={z1,z2,…,zk−1}Z_{k-1}=\lbrace z_1,z_2,…,z_{k-1}\rbraceZk1={z1,z2,,zk1}Xm−1X_{m-1}Xm1Yn−1Y_{n-1}Yn1的最长公共子序列。
    2)xm≠yn,xm≠znx_m\neq y_n,x_m\neq z_nxm=yn,xm=zn;我们可以把xmx_mxm去掉,那么ZkZ_kZkXm−1X_{m-1}Xm1YnY_nYn的最长公共子序列。
    3)xm≠yn,yn≠znx_m\neq y_n,y_n\neq z_nxm=yn,yn=zn;我们可以把yny_nyn去掉,那么ZkZ_kZkXmX_mXmYn−1Y_{n-1}Yn1的最长公共子序列。

看这里:这里应该是从上往下的去思考。

  1. 建立最优值的递归式。
    c[i][j]c[i][j]c[i][j]表示XiX_iXiYjY_jYj的最长公共子序列长度
    xm=yn=zkx_m=y_n=z_kxm=yn=zk;那么c[i][j]=c[i−1][j−1]+1c[i][j]=c[i-1][j-1]+1c[i][j]=c[i1][j1]+1
    xm≠ynx_m\neq y_nxm=yn;那么我们只需要求解XiX_iXiYjY_jYj的最长公共子序列Xi−1X_{i-1}Xi1YjY_jYj的最长公共子序列,比较它们的长度哪一个更大,就取哪一个值。即c[i][j]=max{c[i][j−1],c[i−1][j]}c[i][j]=max \lbrace c[i][j-1],c[i-1][j]\rbracec[i][j]=max{c[i][j1],c[i1][j]}

最长公共子序列长度递归式
c[i][j]={0,i=0或j=0c[i−1][j−1]+1,i、j>0且xi=yjmax{c[i][j−1],c[i−1][j]},i、j>0且xi≠yjc[i][j] = \begin{cases} 0 & ,i = 0 或j=0\\ c[i-1][j-1]+1 & ,i、j>0且x_i=y_j \\ max\lbrace c[i][j-1],c[i-1][j]\rbrace & ,i、j>0且x_i\neq y_j \end{cases} c[i][j]=0c[i1][j1]+1max{c[i][j1],c[i1][j]},i=0j=0,ij>0xi=yj,ij>0xi=yj

  1. 自底向上计算最优解,并记录。
    i=1i=1i=1时:{x1}\lbrace x_1\rbrace{x1}{y1,y2,…,yn}\lbrace y_1,y_2,…,y_n\rbrace{y1,y2,,yn}中的字符一一比较,按递归式求解并记录最长公共子序列长度。
    i=2i=2i=2时:{x2}\lbrace x_2\rbrace{x2}{y1,y2,…,yn}\lbrace y_1,y_2,…,y_n\rbrace{y1,y2,,yn}中的字符一一比较,按递归式求解并记录最长公共子序列长度。

    i=mi=mi=m时:{xm}\lbrace x_m\rbrace{xm}{y1,y2,…,yn}\lbrace y_1,y_2,…,y_n\rbrace{y1,y2,,yn}中的字符一一比较,按递归式求解并记录最长公共子序列长度。

看这里:先算小的,存下来,方便后面直接调用

  1. 构造最优解。
    上面的求解过程只是得到了最长公共子序列长度,并不知道最长公共子序列是什么,那怎么办呢?
    例如,现在已经求出c[m][n]=5c[m][n]=5c[m][n]=5,表示XmX_mXmYnY_nYn的最长公共子序列长度是5,那么这个5是怎么得到的呢?我们可以反向追踪5是从哪里来的。根据递推式,有如下情况。
    xi=yx_i=yxi=y时:c[i][j]=c[i−1][j−1]+1c[i][j]= c[i-1][j-1]+1c[i][j]=c[i1][j1]+1;
    xi≠yjx_i\neq y_jxi=yj时:c[i][i]=max{c[i][j−1],c[i−1][j]}c[i][i]=max\lbrace c[i][j-1], c[i-1][j]\rbracec[i][i]=max{c[i][j1],c[i1][j]};
    那么c[i][j]c[i][j]c[i][j]的来源一共有3个:c[i][j]=c[i−1][j−1]+1,c[i][j]=c[i][j],c[i][j]=c[i−1][j]c[i][j]=c[i-1][j-1]+1,c[i][j]=c[i][j],c[i][j]=c[i-1][j]c[i][j]=c[i1][j1]+1c[i][j]=c[i][j]c[i][j]=c[i1][j]。在第3步自底向上计算最优值时,用一个辅助数组b[i][j]b[i][j]b[i][j]记录这3个来源:
    c[i][j]=c[i−1][j−1]+1,b[i][j]=1c[i][j]= c[i-1][j-1]+1,b[i][j]=1c[i][j]=c[i1][j1]+1b[i][j]=1;
    c[i][j]=c[i][j−1],b[i][j]=2c[i][j]=c[i][j-1],b[i][j]=2c[i][j]=c[i][j1],b[i][j]=2;
    c[i][j]=c[i−1][j],b[i][j]=3c[i][j]=c[i-1][j],b[i][j]=3c[i][j]=c[i1][j],b[i][j]=3
    这样就可以根据b[m][n]b[m][n]b[m][n]反向追踪最长公共子序列,当b[i][j]=1b[i][j]=1b[i][j]=1时,输出xix_ixi;当b[i][j]=2b[i][j]=2b[i][j]=2时,追踪c[i][j−1]c[i][j-1]c[i][j1];当b[i][j]=3b[i][j]=3b[i][j]=3时,追踪c[i−1][j],c[i-1][j],c[i1][j]直到i=0i=0i=0j=0j=0j=0停止。

2.2.3图解思路:

以字符串s1=“ABCA"s_1=“ABCA"s1=ABCA"s2=“BACDA”s_2=“BACDA”s2=BACDA为例。

(1)初始化
len1=4,len2=5len1=4,len2=5len1=4len2=5,初始化c[][]c[][]c[][]第一行、第一列元素为0。

(2)填补矩阵:示例:i=1i=1i=1时。
i=1i=1i=1s1[0]s_1[0]s1[0]s2[j−1]s_2[j-1]s2[j1]比较,其中j=1,2,3,…,len2j=1,2,3,…,len2j=1,2,3,,len2。即A与BACDA分别比较一次。
如果字符相等,c[i][j]c[i][j]c[i][j]取左上角数值加1,记录最优值来源b[i][j]b[i][j]b[i][j]=1。
如果字符不等,取左侧和上面数值中的最大值。如果左侧和上面数值相等,默认取左侧数值。如果c[i][j]c[i][j]c[i][j]的值来源于左侧b[i][j]=2b[i][j]=2b[i][j]=2,来源于上面b[i][j]=3b[i][j]=3b[i][j]=3
在这里插入图片描述
(3)继续处理i=2,3,…,len1i=2,3,…,len1i=2,3,,len1,执行顺序(2)中的步骤。处理结果如图所示。
在这里插入图片描述
c[][]c[][]c[][]右下角的值即为最长公共子序列的长度。c[4][5]=3c[4][5]=3c[4][5]=3,即字符串s1=“ABCA",s2=“BACDA”s_1 =“ABCA",s_2=“BACDA”s1=ABCA",s2=BACDA的最长公共子序列的长度为3。
那么最长公共子序列包含哪些字符呢?

(4)构造最优解
首先读取b[4][5]=1b[4][5]=1b[4][5]=1,说明来源为1,向左上角找b[3][4]b[3][4]b[3][4];不停地寻找~,只有在左上角寻找时输出字符。如下:
在这里插入图片描述
最长序列结果为BCA。

2.2.4伪代码:

  • 最长公共子序列求解函数
void LCSL()
{int i,j;for(i=1;i<=len1;i++)//控制s1序列{for(j=1;j<=len2;j++)//控制s2序列{if(s1[i-1]==s2[j-1]){//如果当前字符相同,则公共子序列的长度为该字符前的最长公共序列+1c[i][j]=c[i-1][j-1] +1;b[i][j]=1;}elseif(c[i][j-1] >=c[i-1][j]){c[i][j]=c[i][j-1];b[i][j]=2;}else{c[i][j]=c[i-1][j];b[i][j]=3;}}}
}
  • 最优解输出函数
void print(int i, int j)//根据记录下来的信息构造最长公共子序列(从b[i][j]开始递推)
{if(i==0 || j==0)return;if(b[i][j]==1){print(i-1,j-1);cout<<s1[i-1];}else if(b[i][j]==2)print(i,j-1);elseprint(i-1,j);
}

2.2.5完整代码:

#include <iostream>
#include<cstring>using namespace std;const int N=1002;
int c[N][N],b[N][N];
char s1[N],s2[N];
int len1,len2;
void LCSL()
{int i,j;for(i=1;i<=len1;i++)//控制s1序列{for(j=1;j<=len2;j++)//控制s2序列{if(s1[i-1]==s2[j-1]){//如果当前字符相同,则公共子序列的长度为该字符前的最长公共序列+1c[i][j]=c[i-1][j-1] +1;b[i][j]=1;}elseif(c[i][j-1] >=c[i-1][j]){c[i][j]=c[i][j-1];b[i][j]=2;}else{c[i][j]=c[i-1][j];b[i][j]=3;}}}
}void print(int i, int j)//根据记录下来的信息构造最长公共子序列(从b[i][j]开始递推)
{if(i==0 || j==0)return;if(b[i][j]==1){print(i-1,j-1);cout<<s1[i-1];}else if(b[i][j]==2)print(i,j-1);elseprint(i-1,j);
}int main()
{int i,j;cout<<"输入字符串s1:"<<endl;cin>> s1;cout<<"输入字符串s2:"<<endl;cin>>s2;len1 = strlen(s1);//计算两个字符串的长度len2 = strlen(s2);for(i=0;i<=len1;i++){c[i][0]=0;//初始化第一列为0}for(j=0;j<=len2;j++){c[0][j]=0;//初始化第一行为0}LCSL(); //求解最长公共子序列cout<<"s1和s2的最长公共子序列长度是:"<<c[len1][len2]<<endl;cout<<"s1和s2的最长公共子序列是:";print(len1,len2);//递归构造最长公共子序列最优解return 0;
}

运行结果:
在这里插入图片描述

2.2.6算法复杂度分析及其改进思路:

未更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410147.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python抓取我的CSDN粉丝数,白嫖GithubAction自动抓取

《Python抓取我的CSDN粉丝数&#xff0c;白嫖GithubAction自动抓取》 一.介绍 这段时间我想申请CSDN的博客专家认证&#xff0c;但是我发现我的总访问量不够&#xff08;博客专家的总访问量要大于20万&#xff09;&#xff0c;所以我就想把我的CSDN每天的 【总访问量】&#…

芯片与自动驾驶技术漫谈

芯片与自动驾驶技术漫谈 从芯片到系统国产,信创产业如何4步走上自主路? 信创产业发展是国家经济数字化转型、提升产业链发展的关键。我国明确了“数字中国”建设战略,抢占数字经济产业链制高点。推进信创产业的发展,促进信创产业在区域性落地生根,带动传统IT信息产业转型,…

【光通信】常见光模块与光纤收发器说明及作用区别

&#xff1a;单纤收发器是指采用的是单模光缆 单纤收发器是只用一根芯&#xff0c;两端都接这根芯&#xff0c;两端的收发器采用不同的光波长&#xff0c;所以能在一根芯里传输光信号。 双纤收发器就是采用了两根芯&#xff0c;一根发送一根接收&#xff0c;一端是发的另一端就…

MongoDB 分片集群均衡器导致的性能下降

近期&#xff0c;有人反馈其mongodb分片集群&#xff0c;在加载处理大批量数据时&#xff0c;程序处理十分缓慢并且应用还会报错&#xff1a;version mismatch detected for 。现将分析汇总如下备用。 一、问题现象 负责同事反馈9月1日18:52分左右&#xff0c;应用报错version…

计算机毕业设计(附源码)python医院预约挂号管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

学习笔记-php伪协议

伪协议 相关文章 & Source & Reference PHP伪协议的妙用 filter协议 php://filter 是一种元封装器&#xff0c; 设计用于数据流打开时的筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用&#xff0c;类似 readfile()、 file() 和 file_get_contents()&#x…

网课查题系统搭建-查题校园题库

网课查题系统搭建-查题校园题库 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&…

【C++笔记】第十九篇 多态

C的多态 1. 多态简介 ① 多态是C面向对象三大特性之一。 ② 多态分为两类&#xff1a; 静态多态&#xff1a;函数重载和运算符重载属于静态多态&#xff0c;复用函数名。动态多态&#xff1a;派生类和虚函数实现运行时多态。 ③ 静态多态和动态多态区别&#xff1a; 静态…

【源码分析】Spring中的设计模式——Context与Factory的关系

省流助手 两个类都实现了同一个接口&#xff0c;但是其中一个类对接口的实现是通过调用另一个类的接口实现来实现的&#xff0c;这就是静态代理模式(也可以说是装饰器模式&#xff0c;这俩区别不大) 这个例子中就是AbstractBeanFactory和AnnotationConfigApplicationContext都…

电子签批板那个品牌好用?国产柜台电子签名板推荐

如今已正式迈入数字时代&#xff0c;电子合同、电子签名不再新奇&#xff0c;各行各业对电子签名呈现出多元化的细分需求&#xff0c;应用场景也更加广泛。目前通信、银行、保险、酒店、政务等有柜台业务服务的领域大多都已配备了电子签字板用以替代传统纸张业务办理流程。加上…

First time to know JAVA

文章目录前言1.JAVA语言概述1.1 JAVA是什么&#xff1f;1.2 JAVA语言的重要性1.3 JAVA语言的发展简史1.4 JAVA语言的特性2.初识JAVA的main方法2.1 main方法示例2.2 运行JAVA程序3.JAVA中的注释3.1 JAVA注释的基本规则3.2 JAVA注释规范4.初始JAVA中的标识符5.初始JAVA中的关键字…

pycharm中做web应用(12)基于Django和mysql 做用户登录验证2

目录pycharm中做web应用&#xff08;12&#xff09;基于Django和mysql 做用户登录验证2Django的用户验证方法Django架构的数据模型数据模型实现方法1&#xff1a;数据模型实现方法2&#xff1a;代码的实现pycharm中做web应用&#xff08;12&#xff09;基于Django和mysql 做用户…

什么蓝牙耳机听歌好?听歌音质好的蓝牙耳机推荐

蓝牙技术已经非常先进了&#xff0c;很多蓝牙耳机的音质体验可以跟有线耳机媲美了。正因为蓝牙耳机的便捷&#xff0c;越来越多的人开始选择蓝牙耳机。如果你还在纠结听歌的音质的话&#xff0c;可以看看下面几款&#xff01; 1、南卡小音舱蓝牙耳机 音质推荐指数&#xff1a…

IDERA ER/Studio Data Architect构建数据模型

IDERA ER/Studio Data Architect能够从用户的单个界面为多个数据库平台创建和管理数据模型。信息建模人员和架构师都希望对与小型业务需求相关的不同高度的数据做出反应。有一些关键行动可能希望他们的重点包括在内。 这些措施包括&#xff1a; 构建数据模型作为增长周期的一部…

LeetCode刷题day25||216.组合总和III17.电话号码的字母组合--回溯

文章目录216.组合总和III题目描述思路分析代码17.电话号码的字母组合题目描述思路分析代码216.组合总和III 题目描述 题目链接 思路分析 相对于77. 组合 (opens new window)&#xff0c;无非就是多了一个限制&#xff0c;本题是要找到和为n的k个数的组合&#xff0c;而整个集…

基于全志T133-s3(Tina Linux)移植7寸RGB显示屏驱动

基于全志T133-s3&#xff08;Tina Linux&#xff09;移植7寸RGB显示屏驱动1.硬件电路2.LCD实物图3.LCD 的驱动4.uboot配置4.1.配置文件4.2.uboot设备树5.kernel配置5.1.内核配置5.2.设备树配置6.测试屏幕7.LVGL实测1.硬件电路 2.LCD实物图 3.LCD 的驱动 Tina Linux 提供了一套…

查题公众号搭建

查题公众号搭建 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳转…

TI Application Notes_Programming Chirp Parameters in TI Radar Devices

Application Notes_Programming Chirp Parameters in TI Radar Devices 1 介绍 system requirement and chirp configuration:系统要求决定了波形或者chirp如何配置。甲方首先提出要求,然后乙方根据要求进行chirp设计。chirp参数的不同会影响系统的参数,如Rmax,Vmax,Rre…

107.(前端)分类管理增加值实现——使用elementui中的动态编辑标签发送请求

1.概述 本节要实现的功能就是&#xff0c;当我们点击动态编辑标签时&#xff0c;丢失焦点或者回车时&#xff0c;发送请求。 2.流程 handleInputConfirm()中&#xff0c;验证form输入框中是否存在值&#xff0c;若存在添加数据到val&#xff0c;若不存在&#xff0c;就制空va…

RHCE(逻辑卷LVM,NFS服务)

LVM逻辑卷管理&#xff0c; 是将一个或多个硬盘的分区在逻辑上集合&#xff0c;相当于一个大硬盘来使用&#xff0c;当硬盘的空间不够用的时候&#xff0c;可以继续将其它的硬盘的分区加入其中&#xff0c;这样可以实现磁盘空间的动态管理&#xff0c;相对于普通的磁盘分区有很…