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

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

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

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

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

分治法的设计思想是将一个规模为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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 诺基亚面向开发商推出下一代手机游戏平台

    诺基亚面向开发商推出下一代手机游戏平台转自:新浪游戏http://tech.sina.com.cn/t/2005-12-21/1748799015.shtml 北京时间12月21日消息,在下一代手机游戏研讨会上,芬兰移动通信巨头诺基亚公司首次向16家诺基亚第一批游戏开发商展示了其下一代手机游戏开发平台。下一代手机游戏研讨会于2005年12月1日到2日在赫尔辛基举行,于12月7日到8日在温哥华举行。 通过下一代手机游

    2022年5月18日
    38
  • python pandas fillna_python rfind函数

    python pandas fillna_python rfind函数本文概述我们可以使用fillna()函数填充数据集中的空值。句法DataFrame.fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,**kwargs)参数值:它是一个用于填充空值的值,或者是一个Series/dict/DataFrame。method:一种用于填充重新…

    2022年8月12日
    2
  • maven快照版本_网站首页快照不更新

    maven快照版本_网站首页快照不更新Maven快照策略,什么是Maven快照。快照版本与Realse版本的区别。修改Maven快照拉取策略。Maven拉取策略

    2022年10月4日
    0
  • CentOS8快速部署轻量级自动化运维平台Spug

    CentOS8快速部署轻量级自动化运维平台SpugSpug面向中小型企业设计的轻量级无Agent的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。Spug的特性批量执行:主机命令在线批量执行在线终端:主机支持浏览器在线终端登录文件管理:主机文件在线上传下载任务计划:灵活的在线任务计划发布部署:支持自定义发布部署流程配置中心:支持KV、文本、json等格式的配置监控中心:支持站点、端口、进程、自定义等监控报警中心:支持短信、

    2022年5月16日
    39
  • 一级倒立摆matlab仿真,一级倒立摆的Simulink仿真「建议收藏」

    一级倒立摆matlab仿真,一级倒立摆的Simulink仿真「建议收藏」一级倒立摆的Simulink仿真单级倒立摆稳定控制直线一级倒立摆系统在忽略了空气阻力及各种摩擦之后,可抽象成小车和匀质摆杆组成的系统,如图1所示。mg杆长为2u图1直线一级倒立摆系统图2控制系统结构假设小车质量M=0.5kg,匀质摆杆质量m=0.2kg,摆杆长度2l=0.6m,x(t)为小车的水平位移,θ为摆杆的角位移,。控制的目标是通过外力(t)使得摆直立向上2…

    2022年8月18日
    3
  • todomvc项目_reactive vue

    todomvc项目_reactive vue所有实现代码在文章结尾处分析整个实现过程的步骤:1.显示大标题“todoMVC”在h1中引入{{msg}},在js文件中将msg赋值,从而在html中显示大标签的内容2.当没有数据时,两块模板需要隐藏,用到v-if标签。将两个模板放在一个template标签中,当items.length=0时,则v-if=false,进而两块模板隐藏。3.引入数据。将JS中写好的默认数据引入在html的每一个li标签中。4.将每个事件划分为完成/未完成。该功能用到双向数据绑定,可以在浏览器中vue模

    2022年9月12日
    0

发表回复

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

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