贪婪法:即只看局部,不顾整体,将局部最优解堆叠的算法
贪婪法不需要顾及多种可能的解,只需要求解当前的局部最优解,所以也就不需要回溯,将这些解堆叠就是最终解。
应用贪婪法步骤:
1.建立对问题精准描述的数学模型,包括最优解的模型
2.将问题分解为一系列的子问题,同时定义子问题的最优解结构
3.求出局部最优解,并依据模型,堆叠出全局最优解
大多数情况下贪婪法只能得到问题的近似解,但是作为一种启发式辅助方法,它常用于其他算法中
分治法:分而治之
分治法的设计思想是将无法着手解决的大问题分解为一系列规模较小的相同问题,然后逐个解决这些小问题,分治法分解产生的子问题和原问题相同,只是规模减小,反复使用分治法可以使得问题不断缩小,直至可以求解。
分治法在很多问题上都有应用,如:最大和最小的问题,矩阵乘法,大整数乘法,排序等
应用分治法一般出于两个目的:通过分解使得问题更容易解决,以及降低问题的复杂度
分治法的三个步骤
1.分解
2.解决
3.合并
分治法的难点是如何将问题分解,并将这些子问题的解合并出原问题的解,就拿快速排序来说,它使用一个标兵元素将原始序列分解,小于标兵元素的序列和大于标兵元素的序列,这就是快速排序的分解,而它的合并则是将两个序列分别接在标兵元素的左右两边。
递归和分治是一对天生的好朋友,想一想,分治法是在保持问题的本质不变的前提下将问题分解的,这样也就可以使用相同的函数来进行,只需要修改传入函数的参数就可以求解不同规模的问题,这不就是递归。