算法设计与分析_【算法基础】传统算法设计分析中的基本思想汇总

1c8874c5e56635594813f6330bcbdc94.png

算法是程序设计的灵魂,是数据处理的基本思想体现。在算法的使用过程中,常常会涉及到算法的一些分析思想,将这些思想进行归类整理之后形成算法的分析类型。常用算法分析类型包括分治法、动态规划法、回溯法、分支限界法以及贪心法,它们都是解决不同问题的思想体现。

642881368d97d77dc2e12ac0125fe2f2.png

1、分治法

分治法是计算机领域中最为常用的算法类型,核心思想在于“分而治之”,原理是将一个复杂混合的问题拆解为两个或者多个相同的子问题,然后将子问题依然进行分治法处理直到子问题已经可以直接求解,最终按照问题的拆解顺序,从子问题开始逐步将问题合并为一个大的子问题,层层向上最后得到该实际问题的解。在算法领域常常是这样,越是规模小的问题越容易求解,分治法也是充分利用此优势发挥其价值。

利用分治法一般解决问题的类型:

(1)待求解的问题是可以拆分为若干相同或者相似的子问题,子问题之间相互独立。

(2)该问题可以在小规模情况下成立,并得到其解。

(3)问题被拆分后的子问题的解之间可以进行合并。

采用分治法解决问题的一般步骤:

(1)分解问题。将原问题拆解为若干相同或相似、相互独立的子问题。

(2)解决子问题。如果拆分的子问题依然无法直接获得解,则继续拆解子问题直到问题可以直接进行求解。

(3)合并解。从可以直接求解的子问题入手,开始合并子问题的解,最终合并得到对原始问题的解。

分治法常常采用递归的方式进行求解,一方面递归可以有效地将问题拆解为相似且更小的子问题,并且子问题之间相互独立、互不干扰。例如对二分查找、归并排序、快速排序等等。但是若利用分治法的情况下,子问题之间存在重复子问题则可能影响分治法的计算效率,因为相同的问题在不同的子问题中均被求解,在这样的情况下则可以考虑利用动态规划的方式进行求解,例如对于排序问题的分治法如下图所示。

ba84634dc11fa70059df7811b0af9eb8.png

2、动态规划法

动态规划是一种将原问题拆解为若干相对简单子问题的求解方法,常常用于重叠子问题和最优子结构性能的问题,通过动态规划的方式,计算量则远远小于一般的解法。原因在于对于重叠子问题,一般情况下会被重复计算,而动态规划则是将重复计算简化为计算一次放入到结果表中,在下一次计算时则从结果表中查询,直接获得结果从而对性能得到提升。

动态规划的方法是一个从初始状态开始计算结果,后续的计算都依赖于前一个计算结果的状态最终获得解的过程。主要步骤包括如下:

(1)划分问题。根据问题的特征,将问题拆解为若干步骤,这些步骤中每一个步骤应当清晰。

(2)确定状态和状态变量。确定计算过程中需要记录的中间状态,并设置状态变量记录中间状态。

(3)确定状态转移过程。状态从初始状态开始,确定在计算过程中状态的转移方式。

(4)寻找终止条件。动态规划不是一个无穷的过程,当状态转移到某个阶段时,触发终止条件得到问题最终的解。

但是并不是针对所有的重叠子问题都是有效的,它适用的情况包括如下情况:

(1)最优子结构性质。最优子结构性质是一种最优化原理,表示如果一个问题的最优解所包含的所有问题的解也是最优的。

(2)子问题重叠性质。子问题重叠表示在把一个大的问题拆解为若干子问题的过程中,在不同的子问题中会重复计算某些问题。动态规划的方法针对子问题重叠计算的问题,将每一个子问题求解的结果存入到子问题结果表中,当再次进行子问题计算时,首先从结果表中查询是否已经计算过,如果已经计算过则直接获取结果,如果没有则进行计算,并将计算的结果存入结果表中。

利用动态规划的方法去解决背包问题、求解最长公共子序列、维特比算法等。

3、回溯法

回溯法是一种通过不断尝试获得问题解的方法。“回溯”的含义表示当发现当前已经不满足求解的条件时,则采用“回溯”的方式,尝试别的方法对问题求解,这种尝试的过程也是一种不断枚举的过程。

回溯法进行尝试的过程并不是漫无目的的穷举解的过程,它在选择求解目标过程中会利用当前条件与目标的最优匹配选择进行尝试,即使当前尝试失败,回溯到上一步继续选择最后匹配选择进行。回溯法解体的过程相对比较通用,同生活中解决一般问题的情况基本一致,因此回溯法的应用相对较为广泛。

回溯法在所有的解空间中,按照深度优先尝试的原则,从初始状态不断深入到各个解空间中,解决过程如下:

(1)对需要解决的问题,确定问题的解空间,确保在解空间的范围内存在最优解。

(2)确定回溯法的尝试规则以及路径寻找的方式,以减少不必要的计算。

4、分支界限法

分支限界法和回溯法是一种类似的问题求解方法。回溯法是通过深度优先的方式对问题进行探索性的解决,而分支限界法则是以广度优先或者以最小代价优先的方式尝试性解决问题。分支限界法的搜索策略是通过在路径选择处,生成其所有的下一步分支,计算每一个分支的某个条件限定值,这些条件限定值即为分支的界限,然后从这些分支中选择某个的分支作为下一个节点,使得问题的搜索路径向着最优解的分支进行,此处选择分支的方式主要有两种:

(1)FIFO(First In First Out):按照先进先出的方式进行选择。

(2)最小代价:选择当前分支中代价最小的分支进行选择。这是一种基于优先队列的方式,优先选择某些分支进行搜索。

分支限界法的核心思想在于:需要确定某一个分支的上下界,一边搜索一遍移除某些不满足条件的分支,以提升问题解决的效率。

用一个例子区分分支限界法与回溯法,即一个广度优先,一个深度优先。例如将一堆重量相等的货物放到两辆货车中,要确定最优的装载方案,则先尽可能使得第一辆货车装满,然后将剩余的货物装载到第二辆货车中,此类属于回溯法,它尽可能寻找与目标相近的解,因此它会不断的往同一辆车中装载货物直到装满,然后换另外一辆货车。而对于分支限界法,则会选择每次最小代价,这种代价可以定义为每辆车剩余的装载量,所以它会在两辆货车之间交替添加货物。

5、贪心法

贪心法也是比较常用的解决问题的方法之一。所谓“贪心”的含义在于当前求解的过程在当前的条件下是最好的选择,并未从整体上触发考虑,属于局部最优解。它没有一定固定的解题框架,重点在于贪心法的贪心策略。

贪心算法并不是一定会对所有问题得到全局最优的解,因此贪心算法适用于通过局部最优解可以获得全局最优解的问题。如果不满足此条件则计算的结果可能与预期存在差异。它的基本思路如下:

(1)首先通过数学模型描述问题。

(2)将原始问题拆解为若干子问题,并对每一个子问题求解,获得每一个子问题的局部最优解。

(3)将每一个子问题的局部最优解进行合并,获得对整个问题的全局最优解。

对于若干子问题的局部最优合并后的解是否是全局最优解的问题,需要通过实际问题进行分析,如果子问题之间相互独立,不相互影响则通过合并基本上都属于全局最优解。例如10个盒子中都有很多数字,若需要求整个10个盒子中的最小值,则只需要将10个盒子中的最小值取出,然后再从这些局部最优解中求解最小值即可。由于求解问题的过程中每一个盒子中寻求最小值是相互独立互不影响,因此最终获得的最小值也属于全局最优解。

贪心策略是贪心法求解问题重要的因素之一,直接关系到是否能够获得局部最优解,因此也可以利用贪心策略进行分析,观察问题是否满足贪心策略,从而推测是否能够求得问题的全局最优解。

本文分类:基础算法

本文作者:刘凡平,转载或引用请声明出处,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值