😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪
文章目录
- 前言
- 算法理论复习
- 一、算法定义
- 二、分治法
- 三、递归
- 四、回溯法(深度优先搜索)
- 五、分支限界法(广度优先搜素)
- 六、动态规划
- 七、贪心法
前言
此文章献给正在准备算法考试的学弟学妹,祝你们都能满绩过算法❤️。
算法理论复习
一、算法定义
- 大O
- 算法定义
算法是求解问题的一系列计算步骤,用来将输入数据转换成输出结果。
特性:
- 输入性
- 输出性
- 确定性
- 可行性
- 有限性
二、分治法
- 定义
对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决;否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。
- 步骤
- 分解:将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模;
- 求解子问题:对这些较小的实例求解(一般使用递归的方法,但在问题规模足够小的时候,有时也会使用一些其他方法)
- 合并:如果必要的话,合并这些较小问题的解,以得到原始问题的解.
- 设计思想
(1)该问题的规模缩小到一定的程度就可以容易地解决。
(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
(3)利用该问题分解出的子问题的解可以合并为该问题的解。
(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
三、递归
- 定义
**在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。**若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。
- 使用条件
(1)需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题完全相同,只是在数量规模上不同;
(2)递归调用的次数必须是有限的;
(3)必须有结束递归的条件(递归基)来终止递归。
四、回溯法(深度优先搜索)
- 基本思想
在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点(开始结点)出发搜索解空间树。
(1)首先根结点成为活结点,同时也成为当前的扩展结点。
(2)在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为新的活结点,并成为当前扩展结点。
(3)如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。
回溯法以这种方式递归地在解空间中搜索,直至找到所要求的解或解空间中已无活结点为止。
- 相关概念
一个复杂问题的解决方案是由若干个小的决策步骤组成的决策序列,解决一个问题的所有可能的决策序列构成该问题的解空间。一般用树形式来组织,也称为解空间树或状态空间。
应用回溯法求解问题时,首先应该明确问题的解空间。解空间中满足约束条件的决策序列称为可行解(是解空间的子集)。
一般来说,解任何问题都有一个目标,在约束条件下使目标达到最优的可行解称为该问题的最优解。
活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点。
死结点:一个所有儿子已经产生的结点称做死结点。
扩展结点: 是指正在产生孩子结点的结点.
深度优先的问题状态生成法:如果对一个扩展结点R,一旦产生了它的一个儿子C,就把C当做新的扩展结点。在完成对子树C(以C为根的子树)的穷尽搜索之后,将R重新变成扩展结点,继续生成R的下一个儿子(如果存在)。
五、分支限界法(广度优先搜素)
- 基本思想
每一个结点只有一次机会成为扩展结点。结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。
- 一般过程
分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。问题的解空间树是表示问题解空间的一棵有序树,常见的有子集树和排列树,在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,那些导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被子加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所求的解或活结点表为空时为止。
- 分支限界法和回溯法的联系
求解目标:
回溯法:找出解空间树中满足约束条件的所有解;
分枝限界法:找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。搜索方式的不同:
回溯法:深度优先的方式搜索解空间树;
分枝限界法:以广度优先或以最小耗费优先的方式搜索解空间树。
六、动态规划
- 基本思想
将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式
- 动态规划问题特征
- 最优性原理
- 无后效性
- 有重叠子问题
- 一般步骤
- 分析最优解的性质,并刻画其结构特征。
- 分段将原问题分解为若干个相互重叠的子问题;
- 建立递归关系,递归地定义最优解(状态转移方程)。
- 计算最优值,以自底向上或自顶向下的记忆化方式。
- 构造最优解,根据计算最优值时得到的信息构造最优解。
- 与分治法的联系
与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,但各问题间往往有重叠。分治法对子问题的重叠部分要被重复计算多次。动态规划法将每个子问题只求解一次并保存在表中,下次查表获得解,免去重复计算。
七、贪心法
- 最优子结构
一个问题的最优解包含其子问题的最优解,则称此问题具有最优子结构性质。
问题的最优子结构性质是该问题可用动态规划算法或贪心法求解的关键特征。
- 基本思想
把求解的问题分成若干个子问题。 对每一子问题求解,得到子问题的局部最优解。把子问题的解局部最优解合成原来解问题的一个解。
- 贪心法与动态规划
动态规划算法具有最优子结构特性和子问题重叠特性,通常以自底向上的方式解各子问题;
算法或贪心法求解的关键特征。
- 基本思想
把求解的问题分成若干个子问题。 对每一子问题求解,得到子问题的局部最优解。把子问题的解局部最优解合成原来解问题的一个解。
- 贪心法与动态规划
动态规划算法具有最优子结构特性和子问题重叠特性,通常以自底向上的方式解各子问题;
而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。