---
title: 五大常用算法
layout: post
---
#五大常用算法

##五大常用算法之一：分治算法  

基本概念就是把一个问题分解成为许多相似的子问题，最后把结果放到一起，组成最终的结果。  
使用分支算法，的需求是能够把一个比较难得问题分解成一些较为简单的子问题，然后使用递归或者其他方法把结果组合。 
 
###分治法适用的情况  


分治法所能解决的问题一般具有以下几个特征：
   
1) 该问题的规模缩小到一定的程度就可以容易地解决   
2) 该问题可以分解为若干个规模较小的相同问题，即该问题具有最优子结构性质。   
3) 利用该问题分解出的子问题的解可以合并为该问题的解；   
4) 该问题所分解出的各个子问题是相互独立的，即子问题之间不包含公共的子子问题。   

第一条特征是绝大多数问题都可以满足的，因为问题的计算复杂性一般是随着问题规模的增加而增加；   
第二条特征是应用分治法的前提它也是大多数问题可以满足的，此特征反映了递归思想的应用；、   
第三条特征是关键，能否利用分治法完全取决于问题是否具有第三条特征，如果具备了第一条和第二条特征，而不具备第三条特征，则可以考虑用贪心法或动态规划法。   
第四条特征涉及到分治法的效率，如果各子问题是不独立的则分治法要做许多不必要的工作，重复地解公共的子问题，此时虽然可用分治法，但一般用动态规划法较好。  

###可使用分治法求解的一些经典问题
 
（1）二分搜索  
（2）大整数乘法  
（3）Strassen矩阵乘法   
（4）棋盘覆盖   
（5）合并排序   
（6）快速排序   
（7）线性时间选择   
（8）最接近点对问题   
（9）循环赛日程表   
（10）汉诺塔   

##五大常用算法之二：动态规划算法
简单的问题思路就是每次计算都会影响之后的计算。  
类似分治算法，都是把问题分解成若干个小问题，然后没计算一个小问题，下面的问题根据前面的结果再次进行计算  
与分治法最大的差别是：适合于用动态规划法求解的问题，经分解后得到的子问题往往不是互相独立的（即下一个子阶段的求解是建立在上一个子阶段的解的基础上，进行进一步的求解）。

###适用的情况

能采用动态规划求解的问题的一般要具有3个性质：  
(1) 最优化原理：如果问题的最优解所包含的子问题的解也是最优的，就称该问题具有最优子结构，即满足最优化原理。   
(2) 无后效性：即某阶段状态一旦确定，就不受这个状态以后决策的影响。也就是说，某状态以后的过程不会影响以前的状态，只与当前状态有关。   
（3）有重叠子问题：即子问题之间是不独立的，一个子问题在下一阶段决策中可能被多次使用到。（该性质并不是动态规划适用的必要条件，但是如果没有这条性质，动态规划算法同其他算法相比就不具备优势）

###动态规划算法基本框架
~~~
for(j=1; j<=m; j=j+1) // 第一个阶段
   xn[j] = 初始值;
 
 for(i=n-1; i>=1; i=i-1)// 其他n-1个阶段
   for(j=1; j>=f(i); j=j+1)//f(i)与i有关的表达式
     xi[j]=j=max（或min）{g(xi-1[j1:j2]), ......, g(xi-1[jk:jk+1])};
 
t = g(x1[j1:j2]); // 由子问题的最优解求解整个问题的最优解的方案
 
print(x1[j1]);
 
for(i=2; i<=n-1; i=i+1）
{  
     t = t-xi-1[ji];
 
     for(j=1; j>=f(i); j=j+1)
        if(t=xi[ji])
             break;
}
~~~

##五大常用算法之三：贪心算法
贪心算法的思路就是计算的每一步都求出当前的最优解，不去考虑全局最优解的情况，但是有一个前提：  
选择的贪心策略必须具备无后效性，即某个状态以后的过程不会影响以前的状态，只与当前状态有关。  
贪心策略适用的前提是：局部最优策略能导致产生全局最优解。   
其实贪心算法的
###贪心算法的实现框架

从问题的某一初始解出发；

while （能朝给定总目标前进一步）   
{   
利用可行的决策，求出可行解的一个解元素；   
}   

由所有解元素组合成问题的一个可行解；

##五大常用算法之四：回溯法
是一种有限深度的算法  
这种算法我理解就是每次进行不同的计算，都有可能发现现在的选择是不正确的，于是返回之前的节点进行其他的计算，而闲杂这个点叫做回溯点
###用回溯法解题的一般步骤：
（1）针对所给问题，确定问题的解空间：  
首先应明确定义问题的解空间，问题的解空间应至少包含问题的一个（最优）解。  
（2）确定结点的扩展搜索规则    
（3）以深度优先方式搜索解空间，并在搜索过程中用剪枝函数避免无效搜索。  

##五大常用算法之五：分支限界法
类似于回溯法，也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下，分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解，而分支限界法的求解目标则是找出满足约束条件的一个解，或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解，即在某种意义下的最优解。