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

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

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

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

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

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


相关推荐

  • Lena.jpg 与图像处理的渊源

    Lena.jpg 与图像处理的渊源作为图像处理研究人员,相信大家一定认识下面这幅图片(下载自:https://en.wikipedia.org/wiki/Lenna):这就是Lenna本人了,全图是很sexy的,大家去看吧(http://www.lenna.org/full/l_hires.jpg)。熟悉图像处理或者压缩的工程师、研究人员和学生经常在他们的实验或者项目任务里使用“Lenna”或者“Lena”的图像。Lenna…

    2022年6月19日
    33
  • Nginx动静分离实现

    Nginx动静分离实现Nginx是一种轻量级,高性能,多进程的Web服务器,非常适合作为静态资源的服务器使用,而动态的访问操作可以使用稳定的Apache、Tomcat及IIS等来实现,这里就以Nginx作为代理服务器的同时,也使用其作为静态资源的服务器,而动态的访问服务器就以Apache为例说明。

    2022年6月12日
    33
  • navicat15激活码【注册码】「建议收藏」

    navicat15激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    183
  • navcat15.0激活码【最新永久激活】

    (navcat15.0激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月31日
    206
  • 数仓拉链表[通俗易懂]

    数仓拉链表[通俗易懂]拉链表一丶什么是拉链表拉链表是一种数据模型,主要是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据的一种常见方式。百度百科的解释:拉链表是维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录,通过拉链表可以很方便的还原出拉链时点的客户记录。二丶拉链表的产生背景在数据仓库的

    2022年10月16日
    5
  • JS中取余与取整

    取余6%2取整抛弃整数parseInt(7/3)向上取整(天花板嘛,代表上)Math.ceil(7/3)向下取整(地板嘛,代表下)Math.floor(7/3)四舍五入Math.round(7/3)

    2022年4月9日
    80

发表回复

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

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