单选题
单选题
第一章 算法基础
f(n)=5logn, g(n)=logn; 用O、 Ω、 θ表示函数f与g之间的关系(C)。
A、O
B、Ω
C、θ
D、未知
解析:
复杂度符号含义:
- O(g(n)):上界,即f(n)的增长速度不超过g(n)的常数倍
- Ω(g(n)):下界,即f(n)的增长速度不低于g(n)的常数倍
- θ(g(n)):紧界,f(n)的增长速度与g(n)完全相同(常数倍关系)
函数关系分析:
- 已知f(n) = 5logn,g(n) = logn,显然f(n) = 5·g(n)
- 上界验证:取c₁=5,当n≥1时,5logn ≤5·logn,满足O(g(n))
- 下界验证:取c₂=5,当n≥1时,5·logn ≤5logn,满足Ω(g(n))
结论:
- f(n)同时满足O(g(n))和Ω(g(n)),因此f(n)=θ(g(n))
核心知识点:常数因子不影响渐近复杂度,θ(g(n))表示两个函数为同阶无穷大,增长速度完全相同。
第二章 分治法
1. 使用分治法求解不需要满足的条件是(A)。
A、子问题必须是一样的
B、子问题不重复
C、子问题的解可以合并
D、原问题和子问题使用相同的方法解
解析:
分治法的基本要素:
- 分解:将原问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题。
- 解决:若子问题规模较小而容易解决则直接解,否则递归地解各个子问题。
- 合并:将各个子问题的解合并为原问题的解。
选项分析:
- 选项A:子问题不必完全相同,只需结构相似,使用相同方法解决即可。例如,快速排序中每次划分的子数组长度不同,但解决方法相同。
- 选项B:子问题必须不重复,否则会导致重复计算,此时更适合用动态规划。
- 选项C:子问题的解必须可以合并,否则无法得到原问题的解。
- 选项D:原问题和子问题必须使用相同的方法解决,这是递归的基本要求。
核心知识点:分治法的关键在于分解、解决和合并三个步骤,子问题只需结构相似,不必完全相同。
2.在寻找n个元素中第k小元素的问题中,如采用快速排序算法思想,运用分治法对n个元素进行划分,如何选择划分基准?下面(D)答案最合理。
A、随机选择一个元素作为划分基准
B、取子序列的第一个元素作为基准
C、用中位数的中位数方法寻找划分基准
D、以上皆可行,但不同方法的算法复杂度上界可能不同
解析:
基准选择方法:
- 选项A:随机选择基准可以避免最坏情况,平均时间复杂度为O(n)。
- 选项B:取第一个元素作为基准,在有序或逆序数组中会导致最坏情况,时间复杂度为O(n²)。
- 选项C:中位数的中位数方法可以保证最坏情况下的时间复杂度为O(n),但实现较为复杂。
复杂度分析:
- 随机选择基准:平均O(n),最坏O(n²)。
- 固定位置选择:最坏O(n²)。
- 中位数的中位数:最坏O(n)。
核心知识点:不同的基准选择方法会影响算法的时间复杂度,中位数的中位数方法可以保证最坏情况下的线性时间复杂度。
3. 有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,99},当采用二分查找法查找关键字为82的元素时,(C)比较后查找成功。
A、1
B、2
C、4
D、8
解析:
二分查找过程:
二分查找可以使用从1开始的物理位置计数或从0开始的数组下标计数,两种方式的查找逻辑和比较次数完全一致,仅描述元素位置的数值不同。
从0开始的数组下标计数
- 初始区间
[0,12],中间下标mid=(0+12)/2=6,对应元素45,82>45,新区间[7,12] - 新区间
[7,12],中间下标mid=(7+12)/2=9,对应元素77,82>77,新区间[10,12] - 新区间
[10,12],中间下标mid=(10+12)/2=11,对应元素95,82<95,新区间[10,10] - 新区间
[10,10],中间下标10,对应元素82,匹配成功
- 初始区间
比较次数:共进行了4次比较。
核心知识点:二分查找的时间复杂度为O(logn),每次比较可以将查找范围缩小一半。
4. 以下不可以使用分治法求解的是(D)。
A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题
解析:
选项分析:
- A、棋盘覆盖问题:正确。棋盘覆盖问题可以通过分治法将棋盘划分为更小的子棋盘,递归求解。
- B、选择问题:正确。选择问题(如寻找第k小元素)可以通过分治法(快速选择算法)求解。
- C、归并排序:正确。归并排序是分治法的典型应用,将数组划分为两半,递归排序后合并。
- D、0/1背包问题:错误。0/1背包问题的子问题存在重叠,更适合用动态规划或回溯法求解,分治法无法有效处理重叠子问题。
核心知识点:分治法适用于子问题独立且不重叠的情况,0/1背包问题的子问题存在重叠,不适合分治法。
5. 实现循环赛日程表利用的算法是(A)。
A、分治策略 B、动态规划法 C、贪心法 D、回溯法
解析:
选项分析:
- A、分治策略:正确。循环赛日程表问题可以通过分治法求解,将问题划分为更小的子问题,递归构造日程表。
- B、动态规划法:错误。动态规划适用于子问题重叠的情况,循环赛日程表问题不满足。
- C、贪心法:错误。贪心法每次选择局部最优,无法保证全局最优,不适用于循环赛日程表。
- D、回溯法:错误。回溯法搜索空间太大,效率太低,不适用于循环赛日程表。
核心知识点:循环赛日程表问题是分治法的典型应用,通过将问题划分为更小的子问题,递归构造最终的日程表。
6. 实现棋盘覆盖算法利用的算法是(A)。
A、分治法 B、动态规划法 C、贪心法 D、回溯法
解析:
选项分析:
- A、分治法:正确。棋盘覆盖问题是分治法的经典应用,将棋盘划分为4个子棋盘,递归处理每个子棋盘,通过覆盖L型骨牌解决。
- B、动态规划法:错误。棋盘覆盖问题的子问题不重叠,不需要保存子问题解。
- C、贪心法:错误。贪心法无法保证全局最优覆盖,不适用于棋盘覆盖问题。
- D、回溯法:错误。回溯法搜索空间太大,效率太低,不适用于棋盘覆盖问题。
核心知识点:棋盘覆盖问题是分治法的经典案例,通过递归划分和合并子问题来解决。
第三章 贪心算法
1. 通常以自顶向下的方式求解最优解的是(A)。
A、贪心算法
B、回溯法
C、动态规划
D、分支限界
解析:
各算法的求解方式:
- 选项A(贪心算法):自顶向下,每次选择当前最优解,逐步构造最终解。它不考虑全局最优,只追求局部最优,通过一系列局部最优选择来得到全局最优解。
- 选项B(回溯法):深度优先搜索,尝试所有可能的解空间,通过剪枝避免无效搜索,是一种试错的方法。
- 选项C(动态规划):通常是自底向上,先求解子问题,再逐步合并得到原问题的解;也可以自顶向下(记忆化搜索),但本质是依赖子问题的解。
- 选项D(分支限界):广度优先或最小消耗优先搜索,通过限界函数剪枝,也是一种试错的方法。
贪心算法的自顶向下特点:
- 贪心算法从问题的初始状态开始,每次做出一个局部最优选择,然后将问题转化为规模更小的子问题。
- 例如,霍夫曼编码中,每次选择两个最小权重的节点合并,逐步构建最优编码树。
核心知识点:贪心算法的核心是自顶向下的局部最优选择,通过一系列局部最优来逼近全局最优。
2. 下列算法中不能解决0/1背包问题的是(A)
A 贪心法 B 动态规划 C 回溯法 D 分支限界法
解析:
选项分析:
- A、贪心法:正确。贪心法无法保证0-1背包问题的最优解,因为它每次选择局部最优,可能会错过全局最优解。例如,一个高价值但重量大的物品可能被贪心算法忽略,而导致无法获得最大价值。
- B、动态规划:错误。动态规划可以保证0-1背包问题的最优解,通过填表方式保存子问题解。
- C、回溯法:错误。回溯法可以通过搜索所有可能解找到0-1背包问题的最优解,虽然效率较低。
- D、分支限界法:错误。分支限界法可以通过剪枝优化,找到0-1背包问题的最优解。
核心知识点:贪心法仅适用于满足贪心选择性质的问题,0-1背包问题不满足该性质,因此不能用贪心法求解。
第四章 回溯法
1. 回溯法解TSP问题时的解空间树是(B)。
A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树
解析:
选项分析:
- A、子集树:错误。子集树用于求解选择问题,每个节点有两个分支(选或不选),如0-1背包问题。
- B、排列树:正确。TSP问题(旅行商问题)要求访问所有城市恰好一次并返回起点,这是一个排列问题,每个节点代表当前路径,分支代表选择下一个城市,解空间树是排列树。
- C、深度优先生成树:错误。深度优先生成树是图的一种生成树,不是解空间树的类型。
- D、广度优先生成树:错误。广度优先生成树是图的一种生成树,不是解空间树的类型。
核心知识点:TSP问题是排列问题,其解空间树是排列树,回溯法求解时需要访问所有排列可能性。
2. 0-1背包问题的回溯算法所需的计算时间为(C)
A、O(2ⁿ)
B、O(nlogn)
C、O(n2ⁿ)
D、O(n)
解析:
核心概念:
- 0-1背包问题:
- 定义:将n个物品装入容量为M的背包,使总价值最大,每个物品只能选或不选(0-1特性)。
- 特点:物品不可分割,容量有限,目标是最大价值。
- 与分数背包区别:分数背包允许取物品的一部分,0-1背包只能取完整物品。
- 解空间:解空间为子集树,每个物品有两种选择,大小为2ⁿ。
- 回溯算法时间复杂度:最坏情况O(n×2ⁿ),n为物品数量。
- 2ⁿ项:解空间是子集树,每个物品有两种选择,总共有2ⁿ个节点
- n因子:每个节点需计算上界函数(O(n)时间)(遍历剩余物品计算最大价值)来判断是否剪枝
- 上界函数作用:判断当前分支是否可能获得更优解,用于剪枝优化
- 总时间复杂度 = 每个节点处理时间O(n) × 节点总数2ⁿ
核心知识点:回溯法解决0-1背包问题的时间复杂度为O(n×2ⁿ)。
3. 对于含有n个元素的排列树问题,最坏情况下计算时间复杂性为(C)。
A、2ⁿ⁺¹-1
B、
C、n!
D、2ⁿ
解析:
核心概念:
- 排列树:
- 定义:排列树是一种解空间树,用于求解排列问题。在排列树中,每个节点表示一个部分排列,每个分支代表选择一个未使用的元素加入到当前排列中。
- 结构特点:
- 根节点表示空排列
- 第k层节点表示长度为k的部分排列
- 每个节点有(n - k)个分支,对应选择剩下的(n - k)个元素中的一个
- 叶子节点表示完整的排列
- 应用场景:
- 旅行商问题(TSP)
- n皇后问题
- 全排列问题
- 作业调度问题
- 与子集树的区别:
- 子集树每个节点有2个分支(选或不选),解空间大小为2ⁿ
- 排列树每个节点有(n - k)个分支,解空间大小为n!
- 示例:对于析**:
- 虽然总节点数约为e·n!,但e是一个常数,不影响渐近时间复杂度。
- 每个节点的计算时间为O(1)。
- 因此,最坏情况下的时间复杂度为O(n!)。
- 为什么说叶子节点是n!:叶子节点对应完整的排列,数量正好是n!,但回溯算法在搜索过程中需要经过所有中间节点才能到达叶子节点。
选项分析:
- 选项A:2ⁿ⁺¹-1 是子集树的节点数,不是排列树。
- 选项C:n! 正确,是排列树的叶子节点数,也是回溯算法在最坏情况下需要处理的渐近时间复杂度(因为总节点数约为e·n!,e是常数)。
- 选项D:2ⁿ 是子集树的节点数,适用于0-1背包问题等。
核心知识点:排列树的叶子节点数为n!,总节点数约为e·n!(e为自然常数),但渐近时间复杂度仍为O(n!),因此回溯法解决排列问题的时间复杂度为O(n!)。3个元素{a, b, c},排列树的根节点有3个分支(选择a、b或c),第二层每个节点有2个分支,第三层每个节点有1个分支,最终有6个叶子节点(3! = 6种排列)。
- 回溯算法的时间复杂度:
- 排列树的总节点数:排列树不仅包含叶子节点,还包含中间节点。对于n个元素的排列树:
- 叶子节点数量:n!(对应所有完整排列)
- 中间节点数量:n!/1! + n!/2! + ... + n!/(n-1)!
- 总节点数:n! * (1/0! + 1/1! + 1/2! + ... + 1/n!) ≈ e·n!(其中e是自然常数,约为2.718)
- 回溯算法的遍历:在最坏情况下,回溯算法需要访问排列树的所有节点,包括中间节点和叶子节点。
- **时间复杂度分
- 排列树的总节点数:排列树不仅包含叶子节点,还包含中间节点。对于n个元素的排列树:
3. 回溯法的效率不依赖于以下哪一个因素?(C)
A、产生x[k]的时间
B、满足显约束的x[k]值的个数
C、问题的解空间的形式
D、计算上界函数bound的时间
解析:
核心概念解释:
- x[k]:回溯法中使用解向量x来表示问题的解,x[k]是解向量的第k个分量,表示当前第k步的选择。例如,在0-1背包问题中,x[k]∈{0,1}表示第k个物品是否放入背包;在旅行商问题中,x[k]表示第k个访问的城市。
- 上界函数(Bound Function):回溯法中用于剪枝的重要函数,用于估计从当前节点出发可能得到的最大(或最小)目标函数值。如果该估计值不优于当前已知的最优解,则可以剪枝,不再搜索该子树。
回溯法效率的影响因素:
- 回溯法的效率主要取决于搜索过程中生成的节点数和每个节点的处理时间。
选项分析:
- 选项A:产生x[k]的时间是指生成解向量第k个分量的时间,这会影响每个节点的处理时间,因此影响整体效率。
- 选项B:满足显约束的x[k]值的个数决定了每个节点的分支数,分支数越多,生成的节点数越多,效率越低。
- 选项C:问题的解空间形式(如子集树或排列树)不直接影响效率,只决定解空间的结构。例如,子集树和排列树的效率主要取决于剪枝效果,而非树的类型。
- 选项D:计算上界函数的时间是指调用bound函数评估当前节点的时间,这会影响每个节点的处理时间,尤其是在剪枝频繁的情况下,计算上界函数的时间占比会更高。
解空间形式的作用:
- 解空间形式决定了搜索的结构,但不影响回溯法的基本效率。
- 无论是子集树还是排列树,回溯法的效率都主要取决于剪枝效果和节点处理时间。
- 例如,对于相同规模的问题,有效的剪枝策略可以使回溯法在不同解空间形式下都获得较高的效率。
核心知识点:回溯法的效率主要取决于分支数、节点处理时间和剪枝效果,而不是解空间的形式。
第五章 分支限定法
1.常见的两种分支限定法为(D)。
A、广度优先分支限定与深度优先分支限定
B、队列式(FIFO)分支限定与堆栈式分支限定
C、排列树与子集树
D、队列式分支限定与优先级式分支限定
解析:
- 分支限定法的基本概念:分支限定法是一种求解组合优化问题的算法,它通过搜索解空间树来寻找最优解,同时使用限界函数来剪枝,避免无效搜索。
回溯法是 “深度优先找所有解,不行就回溯”;
2.在分支限界算法中,优先队列通常用来存储什么?(B)
A、所有已访问的节点
B、待处理的最有希望的扩展节点
C、已经找到的所有解
D、失败的搜索路径
解析:
优先队列在分支限界法中的作用:优先队列是分支限界算法中常用的数据结构,主要用于存储待处理的扩展节点。
优先队列的工作原理:
- 优先队列中的节点按照某种优先级(通常是根据限界函数计算的下界或上界)进行排序
- 每次从优先队列中取出优先级最高的节点进行扩展
- 这种方式确保优先处理最有希望找到最优解的节点,从而提高算法效率
选项分析:
- 选项A:所有已访问的节点不需要存储在优先队列中
- 选项B:正确,优先队列存储待处理的最有希望的扩展节点
- 选项C:已经找到的解通常单独存储,不需要在优先队列中
- 选项D:失败的搜索路径会被直接丢弃,不需要存储
核心知识点:分支限界算法中,优先队列用于存储待处理的扩展节点,根据优先级顺序处理节点,优先处理最有希望找到最优解的节点。
分支限界法是 “按优先级找最优解,不好就放弃”。
常见的分支限定法类型:
- 队列式(FIFO)分支限定法:使用普通队列来存储活结点,按照先进先出的原则选取下一个扩展结点,属于广度优先搜索策略。
- 优先级式分支限定法:使用优先级队列(最大堆或最小堆)来存储活结点,按照结点的优先级(目标函数的估计值)选取下一个扩展结点,属于最佳优先搜索策略。
选项分析:
- 选项A:广度优先和深度优先是搜索策略,不是分支限定法的具体类型。
- 选项B:堆栈式分支限定法不是常见类型,深度优先搜索通常用于回溯法。
- 选项C:排列树和子集树是解空间树的类型,不是分支限定法的类型。
- 选项D:队列式分支限定与优先级式分支限定是常见的两种分支限定法,正确。
核心知识点:分支限定法的两种常见类型是队列式(FIFO)分支限定法和优先级式分支限定法,分别对应广度优先和最佳优先搜索策略。
2.优先级队列式分支限界法选取扩展结点的原则是(C)。
A、先进先出
B、 随机
C、结点的优先级
D、后进先出
解析:
优先级队列式分支限界法的工作原理:
- 使用优先级队列(最大堆或最小堆)来存储活结点。
- 每个活结点都有一个优先级,通常是根据目标函数的估计值计算得到。
- 每次从优先级队列中取出优先级最高(或最低,取决于问题类型)的活结点作为扩展结点。
选项分析:
- 选项A:先进先出是队列式(FIFO)分支限定法的扩展结点选取原则。
- 选项B:随机选取扩展结点不是分支限界法的常见策略。
- 选项C:结点的优先级是优先级队列式分支限界法选取扩展结点的原则,正确。
- 选项D:后进先出是堆栈式结构的特点,通常用于回溯法。
核心知识点:优先级队列式分支限界法根据结点的优先级选取扩展结点,优先级通常由目标函数的估计值决定。
3.在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是(B)。
A、回溯法
B、分支限界法
C、回溯法和分支限界法
D、回溯法求解子集树问题
解析:
活结点的概念:在解空间树搜索中,活结点是指已经生成但尚未扩展的结点。
回溯法与分支限界法的区别:
- 回溯法:使用堆栈来存储活结点,采用深度优先搜索策略。一个活结点可能会被多次访问(当回溯时),因为回溯法会回溯到上一个结点并尝试其他分支。
- 分支限界法:使用队列或优先级队列来存储活结点,采用广度优先或最佳优先搜索策略。一个活结点一旦被取出扩展,就不会再次被访问,因为分支限界法不会回溯,而是继续搜索其他分支。
选项分析:
- 选项A:回溯法中活结点可能被多次访问,错误。
- 选项B:分支限界法中一个活结点最多有一次机会成为活结点,正确。
- 选项C:回溯法不符合条件,错误。
- 选项D:回溯法求解任何问题都可能多次访问活结点,错误。
核心知识点:分支限界法中,活结点一旦被取出扩展,就不会再次被访问,因此一个活结点最多有一次机会成为活结点。
4. 下面不是分支界限法搜索方式的是(D)。
A、广度优先
B、 最小耗费优先
C、 最大效益优先
D、 深度优先
解析:
分支界限法的搜索方式:
- 广度优先:对应队列式(FIFO)分支限界法,按照先进先出的原则扩展结点。
- 最小耗费优先:对应优先级队列式分支限界法,以最小耗费(成本)为优先级,适用于求最小解的问题。
- 最大效益优先:对应优先级队列式分支限界法,以最大效益为优先级,适用于求最大解的问题。
深度优先搜索与分支界限法:
- 深度优先搜索通常用于回溯法,而不是分支界限法。
- 回溯法使用堆栈来存储活结点,实现深度优先搜索。
- 分支界限法使用队列或优先级队列来存储活结点,不使用堆栈,因此不采用深度优先搜索。
核心知识点:分支界限法的常见搜索方式包括广度优先、最小耗费优先和最大效益优先,不包括深度优先,深度优先通常用于回溯法。
5.最大效益优先是( A )的一搜索方式。
A、分支界限法
B、动态规划法
C、贪心法
D、回溯法
解析:
选项分析:
- A、分支界限法:正确。分支界限法使用队列或优先级队列管理活结点,常见搜索策略包括广度优先、最小耗费优先和最大效益优先(使用最大堆实现,优先扩展效益最大的活结点)。
- B、动态规划法:错误。动态规划不使用搜索策略,而是通过填表方式自底向上或自顶向下求解,保存子问题解避免重复计算。
- C、贪心法:错误。贪心法不使用搜索策略,而是每次选择局部最优解,不回溯,不搜索所有可能解。
- D、回溯法:错误。回溯法通常采用深度优先搜索策略,系统搜索所有解,通过剪枝避免无效搜索。
核心知识点:分支界限法的常见搜索方式包括广度优先、最小耗费优先和最大效益优先,而动态规划、贪心法和回溯法不使用最大效益优先搜索。
6.广度优先是( A )的一搜索方式。
A、分支界限法 B、动态规划法 C、贪心法 D、回溯法
解析:
选项分析:
- A、分支界限法:正确。分支界限法的常见搜索方式包括广度优先、最小耗费优先和最大效益优先,其中广度优先对应队列式分支限界法。
- B、动态规划法:错误。动态规划不使用搜索策略,而是通过填表方式求解。
- C、贪心法:错误。贪心法不使用搜索策略,而是每次选择局部最优解。
- D、回溯法:错误。回溯法通常采用深度优先搜索,而不是广度优先。
核心知识点:分支界限法的搜索方式包括广度优先、最小耗费优先和最大效益优先,其中广度优先是队列式分支限界法的搜索方式。
第六章 动态规划
1. 矩阵连乘问题的算法可由( B)设计实现。
A、分支界限算法 B、动态规划算法 C、贪心算法 D、回溯算法
解析:
选项分析:
- A、分支界限算法:错误。分支界限算法适用于寻找最优解,但矩阵连乘问题更适合用动态规划。
- B、动态规划算法:正确。矩阵连乘问题具有最优子结构和重叠子问题性质,动态规划可以通过填表方式保存子问题解,避免重复计算,高效求解。
- C、贪心算法:错误。矩阵连乘问题不满足贪心选择性质,贪心法无法保证最优解。
- D、回溯算法:错误。回溯算法搜索空间太大,效率太低,不适用于矩阵连乘问题。
核心知识点:矩阵连乘问题是动态规划的经典应用,通过将问题划分为子问题,保存子问题解,避免重复计算,实现高效求解。