算法思想详解(7大常用算法思想)

算法思想详解(7大常用算法思想)-mikechen

贪心算法

顾名思义,贪心算法总是作出在当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解,如单源最短路经问题,最小生成树问题等。

在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

在面临选择时,贪心算法都作出对眼前来讲最有利的选择,不考虑对将来的不良影响,每个选择一旦做出,不可更改,不允许回溯,根据不同的贪心策略,贪心算法就不同,贪心解的质量也不同,所以贪心策略很重要。

可以看出,此算法思想很简单,具有高效性,但不一定得出最优解。

贪心算法的基本思路,主要分为如下4步:

基本思路:

1)建立数学模型来描述问题;

2)把求解的问题分成若干个子问题。

3)对每一子问题求解,得到子问题的局部最优解。

4)把子问题的解局部最优解合成原来解问题的一个解。

 

分治算法

分治算法字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解。

分治算法,大致分为如下三个步骤:

算法思想详解(7大常用算法思想)-mikechen

1)分解

将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。

2)求解

若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题。

3)合并

将各个子问题的解合并为原问题的解。

 

动态规划算法

动态规划算法,英文名Dynamic Programming,是一种把原问题分解为相对简单的子问题以求解的方法。

动态规划算法是把原问题分解为若干子问题,自底向上,先求解子问题,把结果存储在表格中。

在求解大问题时直接从表格中查询小问题的解,避免重复计算,从而提高算法效率。

动态规划算法通常用于求解具有某种最优性质的问题,在这类问题中,可能会有许多可行解。

动态规划算法分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

分治算法不同的是,适合于用动态规划算法求解的问题,经分解得到子问题往往不是互相独立的。

动态规划的设计都有着一定的模式,一般要经历以下4个步骤:

1)划分阶段

按照问题的特征,把问题分为若干阶段,划分后的阶段一定是有序的或者可排序的。

 

2)确定状态和状态变量

将问题发展到各个阶段时所处的各种不同的客观情况表现出来。状态的选择要满足无后续性。

 

3)确定决策并写出状态转移方程

状态转移就是根据上一阶段的决策和状态来导出本阶段的状态。根据相邻两个阶段状态之间的联系来确定决策方法和状态转移方程。

 

4)寻找边界条件

状态转移方程是一个递推式,因此需要找到递推终止的条件。

 

搜索算法

搜索法包含穷举搜索,深度优先搜索,广度优先搜索,回溯法,分支限界法,其实这些算法的基础就是穷举搜索,只是加上一定的原则来优化过程,就形成了后面的几种算法。

回溯法就是在深度优先搜索的基础上允许回溯,分支限界法是在广度优先搜索基础上允许剪枝,学习时主要学习思想,这些算法名字不要太在意。

 

近期新算法

①遗传算法

从达尔文的生物进化论中得到启发,借鉴自然选择和进化的原理,模拟生物在自然界的进化过程所形成的一种优化求解方法,遗传算法从代表问题的可能潜在解集的一个种群出发,一个种群有一定数量的个体组成,每个个体实际上是染色体带有特征的实体,每一代根据个体的适应度大小挑选个体,并借助遗传算子进行交叉和变异,得到近似最优解。

②模拟退火算法

他的出发点是物理中固体的退火过程与一般组合优化之间的相似性,固态物质退火时,通常先加温,使其中的粒子自由游动,然后逐渐降低温度,粒子也逐渐形成低能态的晶格,最终形成最低能量的基态。所以他从某一较高初温开始,伴随温度参数的不断下降重复抽样,最终得到全局最优解,他是基于概率的。

③蚁群算法

蚁群算法是模拟自然界蚂蚁觅食过程的一种分布式,启发式群体智能算法,用于求解复杂的组合优化问题,如TSP,JSSP,GCP等问题。

 

递归算法

递归算法就是:一个方法在执行过程中调用自身, 就称为 “递归”。

递归的常用算法伪代码如下:

func( mode){
    if(endCondition){      //递归出口
          end;
    }else{
         func(mode_small)  //调用本身,递归
    }
}

采用递归描述的算法通常有这样的特征:

1)为求解规模为N的问题,设法将它分解成规模较小的问题;

2)然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。

3)这样的分解方法具有收敛性。即存在一个递归返回状态。

 

迭代法

也称辗转法,是一种不断用变量的旧值递推新值的过程。

最常见的迭代法是牛顿法。其他还包括最速下降法、共轭迭代法、变尺度迭代法、最小二乘法、线性规划、非线性规划、单纯型法、惩罚函数法、斜率投影法、遗传算法、模拟退火等等。

利用迭代算法解决问题,需要做好以下三个方面的工作:

1)迭代变量:在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

2)迭代关系:指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

3)迭代过程:迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

迭代法都可以转为递归法。迭代法可以理解为具有递归性质的非递归解法。当然,非递归解法还可利用栈的思想。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法