一、
1.分治法的基本思想
分治法的基本思想就是将一个复杂的问题分成两个或多个相同的子问题,子问题可以分成更小的子问题,直到子问题可以容易解决的时候,原问题的解就是子问题解的和。
2.分治法与动态规划法的相同点
二者都要求原问题具有最优子结构性质,都是将原问题分而治之,分解成若干个规模较小(小到很容易解决的程序)的子问题.然后将子问题的解合并,形成原问题的解.
3.分治法与动态规划法的不同点
分治法将分解后的子问题看成相互独立的,通过用递归来做。
动态规划将分解后的子问题理解为相互间有联系,有重叠部分,需要记忆,通常用迭代来做。
4.分支限界法与回溯法的相同点
相同点:都是对子集树和排列树的搜索。
不同点:求解目标不同,分支界限法的求解目标是找出满足约束条件的也一个解,或是在满足约束的解中找出某种意义的最优解;回溯法找到的是解空间满足约束条件的所有解。搜索策略不同:分支界限法以广度优先搜索或以最小花费优先的方式进行搜索;回溯法以深度优先搜索的方式进行搜索。
5.分治法所能解决的问题一般具有的几个特征是:
该问题的规模缩小到一定程度就可以容易的解决。
该问题可以分解为若干个规模较小的相同问题。
使用小规模的解,可以合并成该问题原规模的解。
该问题所分解出的各个子规模是相互独立的。
6.用分支限界法设计算法的步骤
针对所给问题,定义问题的解空间(对解进行编码)
确定易于搜索的解空间结构(按树或图组织解)
以广度优先或以最小耗费(最大收益)优先的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索
7.回溯法中常见的两类典型的解空间树是
子集树和排列树
8.请简述符号t(n)∈θ(g(n)), t(n)∈Ω(g(n)),t(n)∈Ο(g(n))的含义。
t(n) ∈ θ(g(n))表示函数t(n)的大O复杂度与函数g(n)相同上下界,
t(n) ∈ Ω(g(n))则意味着t(n)下界由g(n)给出,在任何实例的情况下,其时间复杂性的阶不低于g(n)的阶。
t(n) ∈ O(g(n))表示的是上界,在任何实例情况下其算法时间复杂性不超过g(n)的阶。
9.分支限界法的搜索策略是:
(1)分支限界法以广度优先或以最小消耗优先的方式搜索问题的解空间树;(2)每一个活结点只有一次机会成为扩展结点;(3)活结点一旦成为扩展结点,就一次性产生其所有儿子结点;(4)儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点中;(5)从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程,这个过程一直持续到找到所需的解或活结点表为空为止。
10.贪心算法与动态规划算法的差异
相同点:贪心算法和动态规划算法都要求问题具有最优子结构性质性质
不同点:贪心算法要求问题具有贪心选择性质,动态规划算法则不要求。计算方式的不同:动态规划算法通常以自底向上的方式解各子问题.贪心算法以自顶往下的方式进行,每做一次贪心选择就将问题变为规模更小的子问题。
二、算法大题
1、动态规划
算法-动态规划 Dynamic Programming--从菜鸟到老鸟-CSDN博客
通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
- 基本思想:
若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
- 问题特征:
最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。
备忘录方法:备忘录方法与直接递归方法的控制结构相同区别 :(1)备忘录方法为每个求解过的子问题建立了备忘录(2)求解一个子问题时先检査是否已有答案,避免重复求解
- 贪心算法
- 贪心法
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。
- 贪心算法的基本思路:
建立数学模型来描述问题。
把求解的问题分成若干个子问题。
对每一子问题求解,得到子问题的局部最优解。
把子问题的解局部最优解合成原来解问题的一个解。
- 贪心算法的基本要素:贪心选择性质和最优子结构性质。
贪心选择性质:是指所求问题的整体最优解可以通过一系列局部最优的选择(即贪心选择)来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。对具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。满足贪心选择性质必满足最优子结构性质。但是满足最优子结构性质却未必满足贪心选择性质。
- 蛮力法
- 蛮力法基本思想
基于问题的描述与定义,尝试该问题的所有可能的解,并逐一进行测试,如果不可行,就尝试下一种解法,直到找出可行解为止。
4、回溯法
- 回溯法
是对蛮力搜索算法的一种改进,它是一种系统地对问题的解空间进行搜索的算法,在搜索过程中,对解空间进行归约和修剪,使得其效率高于蛮力算法。
解空间树的动态搜索
回溯法从根结点出发,按照深度优先策略遍历解空间树,搜索满足约束条件的解。在搜索至树中任一结点时,先判断该结点对应的部分解是否满足约束条件(可行解),或者是否超出目标函数(最优解)的界,也就是判断该结点是否包含问题的(最优)解,如果肯定不包含,则跳过对以该结点为根的子树的搜索,即所谓剪枝(Pruning);否则,进入以该结点为根的子树,继续按照深度优先策略搜索。(1)用约束条件剪去得不到可行解的子树;(2)用目标函数剪去得不到最优解的子树。这两类函数统称为剪枝函数(Pruning Function)。
- 回溯法中常见的两类典型的解空间树是子集树和排列树。
子集树(Subset Trees):当所给问题是从n个元素的集合中找出满足某种性质的子集时,相应的解空间树称为子集树。在子集树中,|S1|=|S2|=…=|Sn|=c,即每个结点有相同数目的子树,通常情况下c=2,所以,子集树中共有2n个叶子结点,因此,遍历子集树需要Ω(2n)时间。例如, 0/1背包问题的解空间树是一颗子集树。
排列树(Permutation Trees):当所给问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。在排列树中,通常情况下,|S1|=n,|S2|=n-1,…,|Sn|=1,所以,排列树中共有n!个叶子结点,因此,遍历排列树需要Ω(n!)时间。例如, TSP问题的解空间树是一颗排列树。
5、分枝限界法
在层序搜索中,先在当前层找到最优节点,然后在该节点向下继续搜索,使搜索朝着解空间上有最优解的分支推进
- 基本思想
以广度优先或最小耗费(最大效益)优先的方式搜索问题的解空间树每个活结点只有一次机会成为扩展结点并一次性产生其所有儿子结点,儿子结点中导致不可行解或非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。如是最小耗费优先,活结点表需要重新排序。此后从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。
- 适用场景
分支限界法适用于求最优化问题。并且是小型问题。
- 使用步骤
如果问题的目标为最小化,则设定最优解的值Z=∞
根据分枝法则,从尚未被洞悉节点(局部解)中选择一个节点,并在此节点的下一阶层中分为几个新的节点。
计算每一个新分枝出来的节点的下限值。
对每一节点进行洞悉条件测试,若节点满足以下任意一个条件,则此节点可洞悉而不再被考虑:此节点的下限值大于等于Z值。已找到在此节点中,具最小下限值的可行解;若此条件成立,则需比较此可行解与Z值,若前者较小,则需更新Z值,以此为可行解的值。
判断是否仍有尚未被洞悉的节点,如果有,则进行步骤二,如果已无尚未被洞悉的节点,则演算停止,并得到最优解。
- 分支界限法:队列式分支界限法和优先队列式分支界限法。
队列式(FIFO)分支限界法按照队列先进先出(FIFO)原则选取下一个结点为扩展结点。
优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。
- 分治法
- 基本思想
是将一个难以直接解决的大问题划分为一些规模较小的子问题,分别求各个子问题,然后将各个子问题的答案合并成为规模较大的原问题的解。一般来说,分治法的
- 求解过程由以下三个阶段组成:
划分:把规模为n的原问题划分为k个规模较小的子问题
求解子问题:各个子问题的解法和原问题的解法通常是相同的。可以用递归的方法求解各个子问题,某些情况下递归可以转化为循环
合并:把各个子问题合并起来,合并的代价因为情况不同有着很大的差异,因此分治法算法的效率很大上取决于合并的实现。
- 在用分治法设计算法的时候,
最好使得子问题的规模大致相同。也就是将一个问题的划分称为规模相等的k个子问题,这种使得子问题规模大致相等的做法是出自一种平衡子问题的启发性问题。 另外,在使用分治法设计算法的时候,最好使得各个子问题之间相互独立。