1. 分治法算法
基本思想:将一个规模为n的问题分解为k个规模较小的子问题,这些字问题互相独立且与原问题相同。递归的解这些子问题,而后将各子问题的阶合并获得原问题的解。设计
eg:排序
二分搜索:给定已排序好的额n个元素,如今要在这n个元素中找出一特定元素x递归
归并排序 快速排序效率
2. 动态规划搜索
动态规划与分治法相似,其基本思想也是讲待求解问题分解成若干个子问题,先求解子问题,而后从这些子问题的解获得原问题的解。与分治法不一样的是适用于动态规划法求解的问题,经分解获得的子问题每每不是相互独立的。若用分治法来解这类问题,则经分解获得的子问题每每不是相互独立的。若用分治法来解这类问题,则分解获得的子问题数目太多,以致于最后解决原问题须要耗费指数时间,然而不一样子问题数目经常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许屡次。若是咱们可以保存已解决的子问题的答案,而在须要时再找出以求得的答案,这样就能够避免大量的重复计算,从而获得多项式时间的算法。为了达到这个目的,咱们能够用一个表来记录全部已解决的子问题的答案。无论子问题之后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们都具备相同的填表格式。动态规划
能够用动态规划算法解决问题所具备的两个重要性质:时间
最优子结构性质:当问题的最优解包含了其子问题的最优解时,称该问题具备最优子结构性质。在动态规划算法中,问题的最优子结构性质使得咱们可以以自底向上的方式递归从子问题的最优解逐步构造出整个问题的最优解。同时,它也使得咱们能在相对小的子问题空间中考虑问题。表格
子问题重叠性:在用递归法自顶向下解此问题时,每次产生的子问题并不老是新问题,有些子问题被反复计算屡次。动态规划正是利用了这些子问题的重叠性质,对每个子问题只解一次,然后将其保存在一个表格中,当再次须要解此问题时,只是简单地用常数时间查看一下结果。一般不一样的子问题个数随输入问题的大小呈多项式增加。所以,用动态规划算法只须要多项式时间,从而得到较高的解题效率。
动态规划算法一般用于求解具备某种最优性质的问题。在这类问题中,可能会有许多可行解。每个解都对应一个值,咱们但愿找到具备最优值(最大值或最小值)的那个解。设计一个动态规划算法,一般按以下的几个步骤进行:
前三个步骤是动态规划的基本步骤,在只须要求出最优值的情形,第四步能够省去。若须要求出问题的一个最优解,则必须执行步骤4,在步骤3中计算最优值时,一般需记录更多的信息,以便在步骤4中根据所记录的信息,快速构造一个最优解。
eg:
矩阵连乘问题:给定n个矩阵{A1,A2,.....,An},其中Ai与Ai+1是可乘的,咱们要计算出n个矩阵的连乘积。
3. 贪心算法
当一个问题具备最优子结构性质时,咱们会想到用动态规划法去求解。但有时会有更简单有效的办法。
能够用贪心算法求解的的问题通常具备两个重要的性质:贪心选择性和最优子结构性质。
贪心选择性:指所求问题的总体最优解能够经过一系列局部最优的选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。在动态规划算法中,每步所做的选择每每依赖于相关子问题的解,于是只有在接触相关子问题后,才能作出选择。贪心算法中,仅在当前状态下作出最好选择,即局部最优选择,而后再去解做出这个选择后产生的相应子问题。贪心算法所做的贪心选择能够依赖于以往所作过的选择,但毫不依赖于未来所做的选择,也不依赖于子问题的解。正式因为这种差异,动态规划算法一般以自底向上的方式解各子问题,而贪心算法则一般以自顶向下的方式进行,以迭代的方式做出相继的贪心选择,每作一次贪心选择就将所求问题简化为一个规模更小的子问题。
最优子结构性质:当一个问题的最优解包含着它的子问题的最优解时,称此问题具备最优子结构性质。问题所具备的这个性质是该问题可用动态规划算法和贪心算法求解的一个关键特征。