史上最全的五大算法总结

分治算法

一、基本概念

在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当n=1时,不需任何计算。n=2时,只要作一次比较即可排好序。n=3时只要作3次比较即可,…。而当n较大时,问题就不那么容易处理了。要想直接解决一个规模较大的问题,有时是相当困难的。

二、基本策略

对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题。这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解,这种算法设计策略叫做分治法。

如果原问题可分割成k个子问题,1

动态规划

一、基本概念

每次决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。

二、基本思想

基本思想:与分治法类似,也是将待求解的问题分解为若干个子问题,按顺序求解子问题,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部 解,依次解决各子问题,最后一个子问题就是初始问题的解。

与分治法最大的差别:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。

三、适用的情况

(1)最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

(2)无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响,也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

(3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)

四、解题步骤

动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。动态规划的设计都有着一定的模式,一般要经历以下几个步骤:

初始状态→│决策1│→│决策2│→…→│决策n│→结束状态

(1)划分阶段:按照问题的时间特征,把问题分为若干个阶段,在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来,当然,状态的选择要满足无后效性。

(3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

一般,只要解决问题的阶段、状态和状态转移决策确定了,就可以写出状态转移方程。实际应用中可以按以下几个简化的步骤进行设计:

(1)分析最优解的性质,并刻画其结构特征。

(2)递归的定义最优解。

(3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值。

(4)根据计算最优值时得到的信息,构造问题的最优解。

五、算法实现的说明

动态规划的主要难点在于上面4个步骤的确定,一旦设计完成,实现部分就会非常简单。使用动态规划求解问题,最重要的就是确定动态规划三要素:

(1)问题的阶段

(2)每个阶段的状态

(3)从前一个阶段转化到后一个阶段之间的递推关系。

递推关系必须是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。

确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。

      f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}

贪心算法

一、基本概念

在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。

贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。所以,对所采用的贪心策略一定要仔细分析其是否满足无后效性。

二、基本思路

1.建立数学模型来描述问题。

2.把求解的问题分成若干个子问题。

3.对每一子问题求解,得到子问题的局部最优解。

4.把子问题的解局部最优解合成原来解问题的一个解。

三、贪心算法适用的问题

贪心策略适用的前提是:局部最优策略能导致产生全局最优解。实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

四、贪心算法的实现框架

从问题的某一初始解出发;

while(能朝给定总目标前进一步)

{ 

利用可行的决策,求出可行解的一个解元素;

}

由所有解元素组合成问题的一个可行解;

五、贪心策略的选择

因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。

六、例题分析——[背包问题]

有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。

物品 A B C D E F G

重量 35 30 60 50 40 10 25

价值 10 40 30 50 35 40 30

分析:

目标函数: ∑pi最大 约束条件是装入的物品总重量不超过背包容量:∑wi<=M( M=150)

(1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?

(2)每次挑选所占重量最小的物品装入是否能得到最优解?

(3)每次选取单位重量价值最大的物品,成为解本题的策略。

值得注意的是,贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法。贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。

可惜的是,它需要证明后才能真正运用到题目的算法中。一般来说,贪心算法的证明围绕着:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。对于例题中的3种贪心策略,都是无法成立(无法被证明)的,解释如下:

(1)贪心策略:选取价值最大者。反例:

W=30   物品:A B C      重量:28 12 12      价值:30 20 20

根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。

(2)贪心策略:选取重量最小。它的反例与第一种策略的反例差不多。

(3)贪心策略:选取单位重量价值最大的物品。反例:

W=30   物品:A B C      重量:28 20 10      价值:28 20 10

根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断,如果选择A,则答案错误。

回溯法(DFS)

一、基本概念

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。

回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

二、基本思想

在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。

若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。

三、解题步骤

(1)针对所给问题,确定问题的解空间:首先应明确定义问题的解空间,问题的解空间应至少包含问题的一个(最优)解;

(2)确定结点的扩展搜索规则;

(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

四、算法框架

(1)问题框架

设问题的解是一个n维向量(a1,a2,………,an),约束条件是ai(i=1,2,3,……,n)之间满足某种条件,记为f(ai)。

(2)非递归回溯框架

   1.int a[n],i;2.初始化数组a[];3.i = 1;4: while(i>0(有路可走) and (未达到目标)) //还未回溯到头5: {6: if(i > n) //搜索到叶结点7: {8: 搜索到一个解,输出;9: }10: else //处理第i个元素11: {12:a[i]第一个可能的值;13: while(a[i]在不满足约束条件且在搜索空间内)14: {15:a[i]下一个可能的值;16: }17: if(a[i]在搜索空间内)18: {19: 标识占用的资源;20: i = i+1; //扩展下一个结点21: }22: else23: {24: 清理所占的状态空间; //回溯25:i = i–1;26: }27: }

(3)递归的算法框架

回溯法是对解空间的深度优先搜索,在一般情况下使用递归函数来实现回溯法比较简单,其中i为搜索的深度,框架如下:

1: int a[n];2: try(int i)3: {4: if(i>n)5:输出结果;6: else7: {8: for(j =下界; j <= 上界; j=j+1) //枚举i所有可能的路径9: {10: if(fun(j)) //满足限界函数和约束条件11: {12: a[i] = j;13://其他操作14: try(i+1);15:回溯前的清理工作(如a[i]置空值等);16: }17: }18: }19: }

分支限界法(BFS)

一、基本概念

类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法,但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。

二、一般过程

由于求解目标不同,导致分支限界法与回溯法在解空间树T上的搜索方式也不相同。回溯法以深度优先的方式搜索解空间树T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。

分支限界法的搜索策略:在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展对点。为了有效地选择下一扩展结点,以加速搜索的进程,在每一活结点处,计算一个函数值(限界),并根据这些已计算出的函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。问题的解空间树是表示问题解空间的一棵有序树,常见的有子集树和排列树。在搜索问题的解空间树时,分支限界法与回溯法对当前扩展结点所使用的扩展方式不同。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,那些导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被子加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所求的解或活结点表为空时为止。

三、回溯法和分支限界法的区别

回溯法深度优先搜索堆栈活结点的所有可行子结点被遍历后才被从栈中弹出找出满足约束条件的所有解。

分支限界法广度优先或最小消耗优先搜索队列、优先队列每个结点只有一次成为活结点的机会找出满足约束条件的一个解或特定意义下的最优解。

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

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

相关文章

8客户端安装后无法启动_新君越涉水后车辆无法启动

车型&#xff1a;2010君越故障现象&#xff1a;涉水后车辆无法启动询问客户&#xff1a;涉水的水深10cm左右。 外观检查&#xff1a;TCM连接器进水、其它没发现进水迹象使用压缩空气吹干TCM连接器的进水&#xff0c;并处理机舱的接地点。GDS检测&#xff1a;U0074,控制模块通信…

vue 过滤器 filters

<!-- 过滤器&#xff1a; 定义&#xff1a;对要显示的数据进行特定格式化之后再显示&#xff08;使用与一些简单的逻辑&#xff09;语法&#xff1a;1. 注册过滤器&#xff1a;Vue.filter.(name, callback) 或 new Vue{filters: {}}2. 使用过滤器&#xff1a;{{xxx 过滤器名…

Java中的return this

Java中的return this return this就是返回当前对象的引用(就是实际调用这个方法的实例化对象) 示例&#xff1a; /*** 资源url*/public HttpConfig url(String url) {urls.set(url);//return this就是返回当前对象的引用(就是实际调用这个方法的实例化对象)return this;}调用…

mybatis 依赖于jdbc_大数据基础:Mybatis零基础入门

在Java企业级开发任务当中&#xff0c;持久层框架的选择&#xff0c;国内市场的主流选择一定有Mybatis的一席之地&#xff0c;从入门来说&#xff0c;Mybatis的学习难度不算高&#xff0c;但是要把Mybatis发挥出真正的效用&#xff0c;还是需要深入学习的。今天的大数据基础分享…

vue 内置指令

渲染文本 – v-text <!--v-text 指令&#xff1a;1. 作用&#xff1a;向其所在的节点中渲染文本内容2. 与插值语法的区别&#xff1a;v-text 会替换掉节点中的内容&#xff0c;{{xxx}} 则不会 --> <div id"root"><p>{{msg}} {{num}}</p> &g…

java this 三种用法

1.区分成员变量和局部变量 public class ThisDemo {public static void main(String[] args) {Student snew Student("小明明",20);System.out.println(s);}}class Student{String name;int age;public Student(String name, int age) {//注:没有加thisname name;a…

kendo treeview 修改节点显示值_VBA学习笔记60-1: Treeview控件

学习资源&#xff1a;《Excel VBA从入门到进阶》第60集 by兰色幻想本节讲Treeview控件。TreeView控件是以树形结构显示数据的控件。利用TreeView控件&#xff0c;可以设计出树形结构图&#xff0c;便于用户选择不同的项目。总公司人事结构是一级节点&#xff0c;公司一、公司二…

Java之路:this关键字的用法

&#xff08;1&#xff09;this代表当前对象的一个引用。所谓当前对象&#xff0c;指的是调用类中方法或属性的那个对象。 最经常使用this关键字的情况&#xff0c;是在对象的一个属性被方法或构造器的参数屏蔽时&#xff0c;需要调用这个被屏蔽的属性&#xff0c;如下&#xf…

跑分cpu_一加8T现身跑分网站:CPU正式敲定 10月15日见

一加8T将于10月15日发布(海外版将于10月14日发布)&#xff0c;现在关于一加8T的核心规格确认。今天&#xff0c;一加8T现身GeekBench跑分网站&#xff0c;确认该机搭载的是高通骁龙865旗舰处理器&#xff0c;而非高通骁龙865 Plus。与搭载高通骁龙865的一加8相比&#xff0c;一…

初识 react

<!--学 react 的原因&#xff1a;1. 原生 js 操作 DOM 繁琐、效率低&#xff0c;每次都要去获取 DOM每次操作 DOM 都会引起页面的重绘重拍2. 原生 js 没有组件化&#xff0c;代码复用率低react 的特点&#xff1a;1. 采用组件化模式&#xff0c;声明式编码来提高开发效率以及…

Java中static作用及用法详解

1.1概述&#xff1a; static是静态修饰符&#xff0c;什么叫静态修饰符呢&#xff1f;大家都知道&#xff0c;在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的&#xff0c;而所谓静态就是指在编译后所分配的内存会一直存在&#xff0c;直到程序退出内存才会释…

发那科攻丝回退参数_乐享:发那科MF选配功能诊断小结

小编微信&#xff1a;shukong99999乐享数控&#xff0c;专注数控电气乐享那科选项功能小结大家好&#xff0c;我是乐享数控&#xff0c;好久不见&#xff0c;今天起&#xff0c;给大家多总结&#xff0c;相互交流进步。1发那科MF选项功能诊断小结在调试过程中&#xff0c;除了M…

jsx 语法规范

一、插值语法 – {} const str hello react; const VDOM <h1>{str}</h1>; // 注意&#xff1a;是一对大括号 {} 和 Vue( {{}} ) 区分开二、给标签添加类名 – className "" | {} /*css:.active {background-color: red;} */const VDOM <h1 class…

Java中static关键字的作用与用法

写在前面 这篇总结一下Java中static关键字的作用与用法。 参考文献如下&#xff1a; java]static关键字的四种用法Java中static关键字的作用Java中的static关键字解析Java中static关键字的作用 下面直接分析static关键字的四种基本用法。 修饰成员变量 平时的使用当中&am…

matlab怎么画二维热力图_[原创]Day3.箱线图和热力图的绘制

使用Matplotlib和Seaborn进行绘制箱线图和热力图。箱线图箱线图(boxplot)又称盒式图&#xff0c;可以显示数据的分散情况&#xff0c;由五个数值点组成&#xff1a;最大值(max)-上界、最小值(min)-下界、中位数(median)和上下四分位数(Q1, Q3)。它可以帮我们分析出数据的差异性…

java中的Static、final、Static final各种用法

前言 对Static、final、Static final这几个关键词熟悉又陌生&#xff1f; static 加载&#xff1a;static在类加载时初始化&#xff08;加载&#xff09;完成 含义&#xff1a;Static意为静态的&#xff0c;但凡被static 修饰说明属于类&#xff0c;不属于类的对象。 可修饰…

vue图片点击超链接_10秒钟,告别ppt中难看的超链接

我相信大多数同学在创建超链接的时候都很疑惑为什么字体颜色会变成蓝色&#xff0c;且下方会出现一条横线&#xff0c;能不能把横线去掉或者改变颜色呢&#xff1f;零壹君回答你&#xff1a;能&#xff01;快来跟零壹君一起学习吧&#xff01;选中文字—点击【插入】—【超链接…

组件的 props

一、函数式组件的 props function Demo (props) { // 由于函数式组件没有自己的 this 必须指定 propsreturn (<div><ul><li>{props.name}</li><li>{props.age}</li></ul></div>) }// 抽离挂到组件上面的 props 变量 const pe…

java中static、final 和 static final之间的区别

java中static、final 和 static final之间的区别 static可以修饰&#xff1a;全局属性&#xff0c;方法&#xff0c;代码块&#xff0c;内部类&#xff08;静态内部类或嵌套内部类&#xff09; 由于静态属性和方法是属于该类的所有对象的&#xff0c;所以可以用类名.静态属性…

arr数组怎么取值_记一次思否问答的问题思考:Vue为什么不能检测数组变动

作者 | hfhan来源 | https://segmentfault.com/a/1190000015783546问题描述&#xff1a;Vue检测数据的变动是通过Object.defineProperty实现的&#xff0c;所以无法监听数组的添加操作是可以理解的&#xff0c;因为是在构造函数中就已经为所有属性做了这个检测绑定操作。但是官…