五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)

五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)

大家好,又见面了,我是全栈君。

近日复习了一些算法知识,小记于此

  • 递归与分治法
直接或间接地调用自身的算法称为递归算法。 递归是算法设计与分析中经常使用的一种技术,描写叙述简单且易于理解。

分治法的设计思想是将一个规模为n难以解决的问题分解为k个规模较小的子问题,这些子问题
相互独立
与原问题同样
递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

典型样例:Fibonacci数列,阶乘。Hanoi塔;
二分法搜索、高速排序、合并排序。


  • 动态规划法

 

动态规划过程是:依据当前(阶段)状态,採取对应的决策。引起状态的转移。例如以下图。一个决策序列就是在变化的状态中产生出来的,这样的多阶段最优化决策解决这个问题的过程就称为动态规划。


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

                      图1 动态规划决策过程示意图


动态规划过程中的转移中的状态能够是一个。也能够是一个集合,比方状态集合包括{a,b,c},但每一步的状态都是由上一步或几步的状态决定的。

动态规划算法与分治法类似,其思想也是将待求解问题分解成若干个子问题(一般每一个问题相应一个阶段)。
按顺序求解子阶段。前一子问题的解,为后一子问题的求解提供了实用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其它局部解。

依次解决各子问题。最后一个子问题就是初始问题的解。

    因为动态规划解决的问题多数有重叠子问题这个特点,为降低反复计算。对每个子问题仅仅解一次,将其不同阶段的不同状态保存在一个二维数组中。

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

典型样例:最长公共子序列; 最大连续子序列和(
最大m子段和)。


  • 贪心算法
贪心算法在策略的运行过程中。总是做出对当前看来是最好的选择。也就是说贪心算法并不从整理最优上进行考虑。它所做出的选择仅仅是在某种意义上的局部最优选择。

贪心算法不能保证找到的解是最优解,但在某些情况下能够是最优解的近似解。甚至是最优解。


典型样例:哈夫曼编码;单源最短路径(Dijkstra算法)。最小生成树(Prim和Kruskal算法)


  • 回溯法 (DFS搜索解空间)
回溯法是以深度优先方式搜索问题解的算法。它适用于组合数较大的问题,能系统地搜索到一个问题的全部解惑任一解。
回溯法解题通常包括3个步骤:①针对所给的问题。定义问题的解空间。  ②确定易于搜索的解空间的结构; ③ 以DFS搜索解空间,并在搜索过程中用剪枝函数(约束条件)避免无效搜索。

解空间树
①子集树:当所给问题是从n个元素的结合S中找出满足某种性质的子集时。对应的解空间树称为子集树。

比如n个物品的0-1背包问题。这类子集树通常有2^n个叶节点,其节点总个数为为2^(n+1)-1。

遍历子集树的不论什么算法均需O(2^n)的计算时间

②排列树:当所给问题是确定n个元素满足某种性质的排列时,对应的解空间树成为排列树。

比如旅行售货员问题。排列树通常有n!

个叶节点。因此遍历排列树须要O(n!)的计算时间。


搜索实现能够递归。也能够用树的非递归深度优先遍历算法来实现(用到
栈Stack)。

典型样例:八皇后(找出全部的解),
N 皇后

  • 分支界限法(BFS搜索解空间)
分支界限法的求解目标是找出满足约束条件的一个解。或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。(分支界限法与回溯法求解目标不同)

分支界限法以广度优先或以最小耗费(最大收益)优先的方式搜索解空间。所谓“分支”就是在扩展节点处,先生成其全部儿子节点(分支)。然后在从当前的活结点表中选择下一个扩展节点。继续搜索。过程中能够用约束条件,进行剪枝。
常见的扩展节点的常见方式:
先进先出FIFO队列
优先队列分支界限法


典型样例:单源最短路径


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108483.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月3日 下午2:00
下一篇 2022年3月3日 下午2:00


相关推荐

  • Android Layout 之 RelativeLayout RelativeLayout.LayoutParams

    Android Layout 之 RelativeLayout RelativeLayout.LayoutParamsAndroidLayout之RelativeLayout使用AbsoluteLayout可以直接指定其子View的绝对位置,这种布局方式虽然简单,但是不够灵活。比如在一个程序中,按钮2位于按钮1的下方且和按钮1左对齐,我们可以使用指定两个按钮的绝对位置的方式布局,但是当布局完成后,由于某些原因,这两个按钮需要相左平移一些距离以便在父View右边留出一些空白区域…

    2022年7月17日
    18
  • eclipse使用–设置自动补全代码

    1、Java设置自动补全(1)设置自动补全依次点击Window–>Perferences(选项设置)–>Java–>Editor(编辑)–>ContentAssist(内容辅助/代码提示)然后在“ContentAssist”页面中,可以看到下面有一个AutoActivation中有一个Autoactivationtrigge…

    2022年4月4日
    792
  • Effective Python之编写高质量Python代码的59个有效方法

    这个周末断断续续的阅读完了《EffectivePython之编写高质量Python代码的59个有效方法》,感觉还不错,具有很大的指导价值。下面将以最简单的方式记录这59条建议,并在大部分建议后面加上

    2021年12月30日
    46
  • Linux主机文件777,755,644权限详解[通俗易懂]

    Linux主机文件777,755,644权限详解[通俗易懂]Linux主机的文件读写执行权限设置。一般的网站用的到也就是777、755、644这三种权限。其中每个权限都有三位数字组成,第一位表示所有者的权限,第二位表示同组用户权限,第三位表示公共用户权限,r代表读取权限等于4,w代表写入权限等于2,x代表执行权限等于1。  777的权限就是:rwxrwxrwx 。第一位7等于4+2+1,所以就是rwx,所有者有读取、

    2022年6月21日
    25
  • 深度学习中的9种归一化方法概述

    深度学习中的9种归一化方法概述9种归一化(Normalization)方法概述

    2025年7月4日
    5
  • 详细完整MySQL8.0.23安装教程

    文章目录目录前言一、官网下载MySQL地址:https://dev.mysql.com/downloads/mysql/二、配置解压文件1.解压2.配置my.ini文件三、初始化四、安装启动mysql服务后续前言最近在做一个人脸识别的项目,需要用数据库保存学生信息与前段交互。MySQL的优点1、mysql性能卓越,服务稳定,很少出现异常宕机。2、mysql开放源代码且无版权制约,自主性及使用成本低。3、mysql历史悠久,社区及用户非.

    2022年4月11日
    211

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号