算法学习笔记
Posted ACheng63201
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习笔记相关的知识,希望对你有一定的参考价值。
文章目录
算法学习笔记
分治法
-
基本思想:将一个规模为n的问题分解为k个规模较小,互相独立的子问题且与原问题相同。递归的解子问题,再将子问题的解合并成原问题的解
-
适用范围
- 该问题的规模缩小到一定程度就可以容易的解决;
- 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
- 利用该问题分解出子问题的解,可以合并为该问题的解;
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题;
-
算法框架:
回溯法
-
基本思想
- 解空间:用回溯法求解问题时,应明确定义问题的解空间。问题的解空间至少应包含问题的一个最优解
- 活结点,扩展节点,死节点:确定了解空间的组织结构后,回溯法从开始结点(根结点)出发,以深度优先方式搜索整个解空间。这个开始结点成为活结点,同时成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为新的活结点,并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已无活结点时为止。
-
适用范围:当问题是要求满足某种性质(约束条件)的所有解或最优解时,往往使用回溯法。它有“通用解题法”之美誉。
-
解题步骤:
- 针对所给问题,定义问题的解空间;
- 确定易于搜索的解空间结构
- 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索
-
算法框架:
-
子集树:
-
排列树
-
分支界限法
- 基本思想:分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。问题的解空间树是表示问题解空间的一棵有序树,常见的有子集树和排列树。在搜索问题的解空间树时,每个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。
- 队列式分支界限:队列式分支限界法将活结点表组织成一个队列,并按队列的先进先出原则选取下一个结点为当前扩展结点。
- 优先队列式分支界限:优先队列式的分支限界法将活结点表组织成一个优先队列,并按优先队列中规定的结点优先级选取优先级最高的下一个结点成为当前扩展结点。优先队列中规定的结点优先级常用一个与该结点相关的数值 p 来表示。结点优先级的高低与 2.值的大小相关。最大优先队列规定 p 值较大的结点优先级较高。
- 适用范围:一种在问题的解空间树T上搜索问题解的算法,分枝界限法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
分治界限法与回溯法的区别
-
回溯法
- (求解目标)回溯法的求解目标是找出解空间中满足约束条件的一个解或所有解。
- (搜索方式深度优先)回溯法会搜索整个解空间,当不满条件时,丢弃,继续搜索下一个儿子结点,如果所有儿子结点都不满足,向上回溯到它的父节点。
-
分支限界法
- (求解目标)分支限界法的目标一般是在满足约束条件的解中找出在某种意义下的最优解,也有找出满足约束条件的一个解。
- (搜索方式)分支限界法以广度优先或以最小损耗优先的方式搜索解空间。
贪心算法
-
基本思想:
- 贪心算法通过一系列选择来得到问题的解,所做的每个选择都是当前状态下局部最好选择,所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择达到。
- 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
-
适用范围:局部最优策略能导致产生全局最优解
动态规划
- 基本思想
- 最优子结构:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
- 重叠子问题:在用递归算法自顶向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算。动态规划算法正是利用了这种子问题的重叠性质,对每个一子问题只解一次。然后将其解保存在,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。
- 备忘录
- 解题思想:
- 找最优子结构
- 递归求解
- 计算最优值
- 构造最优解
贪心与动态规划的区别
-
在动态规划算法中,每步所做的选择往往依赖干相关子问题的解。因而只有在解出相关子问题后,才能做出选择。 而在贪心算法中,仅在当前状态下做出最好选择,即局部最优选择,再去解做出这个选择后产生的相应的子问题。
-
贪心算法所做的贪心选择可以依赖以往所做过的选择,但决不依赖将来所做的选择,也不依赖子问题的解。正是由于这种差别,动态规划算法通常以自底向上的方式解各子问题,贪心算法则通常以自顶向下的方式进行,以迭代的方式做出相继的贪心选择, 没做一次贪心先择, 就将所求问题简化为规模更小的子问题。
参考书籍《计算机算法设计与分析 王晓东 第五版》
以上是关于算法学习笔记的主要内容,如果未能解决你的问题,请参考以下文章