1、递归和分治;
2、动态规划(DP);
3、贪心算法;
4、回溯法;
5、分支限界法;
6、概率算法;
7、线性规划;
8、NP完全性理论。
我们平常所见的一般都是前5种,这里简单介绍。
分治法:把一个大规模问题划分成几个子问题,对每一个子问题采用同样的处理方法,求出各子问题的解答,再把这些子问题的解答组合成整个问题的解答。子问题相互独立。
动态规划:当整个问题的解答无法由少数几个子问题的解答组合得出,而依赖于大量子问题的解答,并且子问题的解答又需要反复利用多次时,系统地列表记录各个子问题的解答,据此求出整个问题的解答。记录在表、子问题不相互独立、最优子结构、重叠子问题。
贪心算法:在算法的每一步骤,都采取当前看来可行的或最优的策略。这是一种最直接的方法,只有在一些特殊情况下,贪婪法才能求出问题的解答。对于录求最优解的问题、贪婪法通常只能求出近似解。
回溯法:为了寻求问题的解答,有时需要在所有的可能性(称为候选对象)中进行系统的搜索,例如在寻求最优解的问题中,就常碰到这种情况。这时,须把各种候选对象组织成一棵树,每个树叶对应着一个候选对象,于是每个内部顶点就表示若干个候选对象(即在此顶点下面的树叶)。回溯法是从树根开始按深度优先搜索的原则向下搜索,即沿着一个方向尽量向下搜索,直到发现此方向上不可能存在解答时,就退到上一个顶点,沿另一个方向进行同样的工作。回溯法一般用来求解所有满足约束条件的解。通常为了加速,和分支截断法配合使用。分叉截断法也是从树根开始向下搜索,不同的是,分叉截断法常常利用一个适当选取的评估函数,来决定应该从哪一点开始下一步搜索(分叉),以及哪一点下方不可能存在解答,从而这点的下方不必进行搜索(截断)。评估函数选得好,就会很快地找到解答,选得不好,就可能找不到解答或者找到的不是最优解(有时它可以作为最优解的一个近似解)。
分支限界法:分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。