动归、贪心、分治、回溯
填空题
-
解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是 动态规划,需要排序的是回溯法,分支限界法。
-
利用分支界限法实现算法设计时,通常采用 堆 实现来构造优先队列。
-
优先队列式分支界法选取扩展结点的依据是 结点的优先级
-
队列式分支限界法:将活结点组织成为一个队列,并按照队列先进先出的原则选取下一个结点作为扩展节点。
优先队列式分支限界法:将活结点组织成一个优先队列,并选取优先级最高的结点作为扩展结点。
活结点:自身已经生成但是孩子结点没有全部生成的结点
扩展结点:正在产生孩子的结点
-
-
分支限界法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
-
分支界限法和回溯法主要区别在于 求解目标和搜索方式不同。
回溯法:
(1)求解目标:找出解空间中满足约束条件的所有解
(2)搜索方式:深度优先搜索
分支限界法:
(1)求解目标:在解空间中找到满足约束条件的最优解
(2)搜索方式:广度优先搜索
-
以广度优先或以最小耗费方式搜索问题解的算法称为 分支限界法 。
-
回溯法和分支限界法 在搜索解空间树的时候,为了避免无效搜索,通常使用剪枝策略来提高搜索效率。
避免无效搜索的方法,常用的两种剪枝函数为 约束函数 和 限界函数 。
(1)约束函数:减去不满足约束的子树
(2)限界函数:剪去得不到解或最优解的子树
-
分支界限法和回溯法分别用广度优先遍历或者最小耗费优先、深度优先的方式搜索解空间树。
-
用回溯法解0/1背包问题时,该问题的解空间结构为 子集树 结构。问题的解空间树常见的有子集树、排列树两种类型。
子集树:所给的问题是从n个元素的集合中找到满足某种性质的子集。
排列树:所给的问题是从n个元素满足某种性质的排列时相应的解空间树。
-
若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},序列X和Y的最长公共子序列是{BABCD}或{CABCD}或{CADCD}
字符序列的子序列是指:从字符序列中随意地去掉若干个字符后形成的字符序列。
-
动态规划算法的两个基本要素是 最优子结构 性质和 重叠子问题 性质 。
-
动态规划算法的基本思想是将待求解问题分解成若干 子问题 ,先求解 子问题 ,然后从这些 子问题 的解得到原问题的解。
动态规划的三个性质:
(1)最优子结构:问题的最优解所包含的子问题也是最优的。
(2)无后效性:某状态以后的过程不会影响以前的状态。
(3)有重叠子问题:子问题之间是不独立的,一个子问题在下一阶段的决策中可能会被多次使用。(分治法的子问题是相互独立的)
-
问题的最优子结构性质 是该问题可用动态规划算法和贪心算法求解的关键特征。
贪心算法基本要素:
(1)贪心选择性质:每一步所做的贪心选择最终导致问题的整体最优解。
(2)最优子结构性质:一个问题的最优解包含其子问题的最优解。
而动态规划也具有最优子结构性质。
-
贪心法的基本思路是在对问题求解时总是做出在当前看来是最好的选择,也就是说贪心法不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。
-
大整数乘积算法是用 分治法 来设计的。
-
快速排序算法的性能取决于 划分的对称性
-
分治法通常采用递归算法设计技术,在每一层递归上都有3个步骤:分解、求解子问题、合并。
-
冒泡排序算法属于穷举法 (两层for循环)
-
直接采用穷举法设计算法中,主要是使用 循环语句 和 选择语句,循环语句用于穷举所有可能的情况,而选择语句判定当前的条件是否为所求的解。
-
当设定的问题有多种算法去解决时,其选择算法的主要原则是 选择其中复杂性最低者。
-
任何可用计算机求解的问题所需的时间都与其 规模 有关。
选择题
- 分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。这要求原问题和子问题(C)。
A.问题规模相同,问题性质相同
B.问题规模相同,问题性质不同
C.问题规模不同,问题性质相同
D.问题规模不同,问题性质不同
- Strassen矩阵乘法是利用( A )实现的算法。
A.分治策略 B.动态规划法 C.贪心法 D.回溯法
- 使用分治法求解不需要满足的条件是( A )。
A.子问题必须是一样的
B.子问题不能够重复
C.子问题的解可以合并
D.原问题和子问题使用相同的方法解规模改变,问题性质不变
- 实现大整数的乘法是利用的算法( C )
A.贪心法 B.动态规划法 C.分治策略 D.回溯法
- (C)是贪心算法的基本要素。
A.重叠子问题 B.构造最优解 C.贪心选择性质 D.定义最优解
- 背包问题的贪心算法所需的计算时间为(B)
A.O(n2^n) B.O(nlog2n) C.O(2n) D.O(n)
/*
问题描述:与0 / 1背包问题不同的是,完全背包问题可以装入一部分物品进入背包,也就是说背包一定可以装满。
方案:将物品以单位价值从大到小排序,除最后一个物品只取一部分之外,其他物品要么全拿,要么不拿
时间复杂度:快速排序(Onlog2n)
*/
- 以下不属于贪心算法的是( D)
A.Prim算法 B.Kruskal算法 C.Dijkstra算法 D.深度优先遍历
//深度优先遍历: 回溯,走不通的时候回溯
- 下面问题( B )不能使用贪心法解决。
A.单源最短路径问题
B.N皇后问题
C.最小生成树问题
D.背包问题
- 一个问题可用动态规划算法或贪心算法求解的关键特征是问题的( C)
A.贪心选择性质 B.重叠子问题 C.最优子结构性质 D.定义最优解。
- 下列算法中不能解决0/1背包问题的是(A)
A.贪心法 B.动态规划 C.回溯法 D.分支限界法
- 贪心算法与动态规划算法的主要区别是( B )。
A、最优子结构 B、贪心选择性质 C、构造最优解 D、定义最优解
/*
贪心算法基本要素:
(1)贪心选择性质:每一步所做的贪心选择最终导致问题的整体最优解。
(2)最优子结构性质:一个问题的最优解包含其子问题的最优解。
而动态规划也具有最优子结构性质。
*/
- 动态规划算法的基本要素为( C )
A.最优子结构性质与贪心选择性质
B.重叠子问题性质与贪心选择性质
C.最优子结构性质与重叠子问题性质
D.预排序与递归调用
- 关于回溯法以下叙述中不正确的是(C)。
A.回溯法有“通用解题法”之称,它可以系统地搜索一个问题的所有解或任意解
B.回溯法是一种既带系统性又带有跳跃性的搜索算法
C.回溯算法需要借助队列这种结构来保存从根结点到当前扩展结点的路径
D.回溯算法在生成解空间的任一结点时,先判断该结点是否可能包含问题的解,如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向祖先结点回溯
//C: 借助于树结构
- 下列算法中通常以深度优先方式系统搜索问题解的是( D )。
A.备忘录法 B.动态规划法 C.贪心法 D.回溯法
//回溯法:深度优先
//分支限界法:广度优先
- 下面哪种函数是回溯法中为避免无效搜索采取的策略( B )。
A.递归函数 B.剪枝函数 C.随机数函数 D.搜索函数
/*
避免无效搜索的方法:
(1)约束函数:减去不满足约束的子树
(2)限界函数:剪去得不到解或最优解的子树
*/
- 0-1背包问题的回溯算法所需的计算时间为( C )
A.O(n^2) B.O(nlogn) C.O(2^n) D.O(n)
- 最大效益优先是( A )的一搜索方式。
A.分治策略 B.动态规划法 C.贪心法 D.回溯法
- 下面不是分支界限法搜索方式的是( D )。
A.广度优先 B.最小耗费优先 C.最大效益优先 D.深度优先
//回溯法:深度优先
//分支限界法:广度优先
- 分支限界法解0/1背包问题时,优先级队列的组织形式是( B )。
A.小根堆 B.大根堆 C.栈 D.循环链表
/*
最大优先队列:大根堆
最小优先队列:小根堆
队列式分支限界法:队列
*/
- 优先队列式分支限界法选取扩展结点的原则是( C )。
A.先进先出 B.后进先出 C.结点的优先级 D.随机
// 选取优先级最高的结点作为当前的扩展结点。
代码题
- 汉诺塔问题
void Hanoi(int n, int A,int B,int C){
if(n>0){
Hanoi (n-1,A,C,B);
Move(n,a,b);
Hanoi(n-1,C,B,A);
}
}