算法分析类型
算法分析类型包括分治法、动态规划法、回溯法、分支界限法和贪心法,接下来我们将对这些算法分析方法一一回顾学习。
分治法
方法原理:
核心思想在于‘分而治之’,原理是首先将一个复杂混合的问题拆解为两个或多个相同的子问题,然后将子问题依然用分治法进行处理,知道子问题可以直接求解,最终按照问题的拆解顺序,从子问题开始逐步将问题合并为一个大的子问题,层层向上,最后得到该实际问题的解。
适用条件:
(1)子问题相互独立
(2)原问题在小规模情况下成立,有解
(3)拆分得到子问题的解之间可以合并
实现步骤:
(1)分解问题;(2)解决子问题;(3)合并解
分治法常常使用递归的方式进行求解,比如二分查找、归并排序、快速排序等等
动态规划法
原理:
一个从初始状态开始计算结果,后续的计算都依赖于前一个计算结果的状态,最终获得解的过程。常用于求解重叠子问题和最优子结构问题,动态规划可以将重复计算简化为计算一次就放入到结果表中,在下次计算时就直接从结果表中查询。
适用条件:
(1)具有最优子结构性质:表示一个问题的最优解所包含的所有问题的解也是最优的
(2)子问题重叠性质:表示把一个大的问题拆解为若干的子问题过程中,在不同的问题中会重复计算某些问题
实现步骤:
(1)划分问题
(2)确定状态和状态变量
(3)确定状态转移过程
(4)寻找终止条件
动态规划可以解决背包问题、求解最长公共子序列、维特比算法等问题
回溯法
原理:
回溯的含义是当发现当前已经不满足求解的条件时,采用‘回退’的方式,尝试其他的方法对问题求解,也是一种不断枚举的过程。然而这种尝试是有选择性的,选择当前条件与目标的最优匹配进行尝试,失败回退到上一步,常常是深度优先的方式进行尝试。
实现步骤:
(1)确定存在最优解的解空间,
(2)确定回溯的尝试规则与路径寻找的方式
分支界限法
原理:
相比于回溯法的深度优先的方式,分支界限法使用的是广度优先或最小代价的方式对问题求解。首先通过在路径选择处,生成其所有的下一分支,计算每个分支的某个条件限定值(分支的界限),然后从分支中选出某一节点作为最优解的分支下一起始点。
分支界限的核心思想是确定分支的上下界,并移除不满足条件的分支。
分支选择方式 :
(1)FIFO:先进先出
(2)最小代价:从当前分支中选择代价最小的,是基于优先队列的方式
鉴于回溯法和分支界限法的类似性,这里举个例子加深区分它们:
例如,将一堆质量相等的货物放到两辆货车中,确定最优的装载方案?
回溯法的思路是首先尽可能的使第一辆货车装满,然后将剩下的货物装载到第二辆车
分支界限法可能选择最小的代价(每辆车剩余的装载量),因此会在两辆车之间交替添加货物
贪心法
原理:
所谓贪心,是当前求解的过程在当前条件下是最好的选择,属于局部最优解,所以贪心算法适用于可以通过局部最优解获得全局最优解的问题
实现步骤:
(1)数学模型描述问题
(2)拆解问题,求解子问题的局部最优解
(3)合并局部最优解
贪心策略的选择是求解此类问题的关键所在,例如10个盒子中有很对数字,要求所有盒子的最小值,那么只需要将10个盒子中的每个盒子的最小值取出然后找出原问题的最小值即可。