算法习题——选择题

1、关于算法的说法中正确的有(C)。

Ⅰ.求解某一类问题的算法是唯一的(如:冒泡排序可以用:穷举法、递归)

Ⅱ.算法必须在有限步操作之后停止

Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊

Ⅳ.算法执行后一定产生确定的结果

A.1个           B.2个           C.3个           D.4个

算法设计的目标:

(1)正确性:正确地执行预先规定的功能和性能要求。

(2)可使用性(用户友好性):可以很方便地使用。

(3)可读性:易于理解。

(4)健壮性:提供异常处理,能够对不合理的数据进行检查。

(5)高效率与低存储:执行时间短的算法效率高,所需的最大存储容量低的算法好。

算法的重要特性:

(1)有限性:执行有限步之后结束。

(2)确定性:每一条指令无二义性。

(3)可行性:每一条运算都能精确地执行。

(4)输入性:一个算法有零个或多个输入。

(5)输出性:一个算法有一个或多个输出。

2、T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是(C)。

A.T(n)= T(n-1)+1,T(1)=1                B.T(n)= 2n2

C.T(n)= T(n/2)+1,T(1)=1                D.T(n)=3nlog2n

3、以下关于渐近记号的性质是正确的是(A)

A.f(n)=O(g(n)),g(n)=O(h(n))⇒f(n)=O(h(n))       (传递性)

B.f(n)=O(g(n)),g(n)=O(h(n))⇒h(n)=O(f(n))         (不满足传递性)

C.O(f(n))+O(g(n))=O(min(f(n),g(n)))      (max)

D.f(n)=O(g(n))⇔g(n)=O(f(n))     (上限不满足反身性)

4.Hanoi塔问题如下图所示,现要求将塔座A上的所有圆盘移到塔座B上,并仍按同样顺序叠置,移动圆盘时遵守Hanoi塔问题的移动规则,由此设计出解Hanoi塔问题的递归算法正确的是(B)

汉诺塔:https://www.cnblogs.com/zhai1997/p/11773077.html

A、

void Hanoi(int n, int A,int C,int B){ 

if(n>0)

{Hanoi (n-1,A,C,B);

Move(n,a,b);

Hanoi(n-1,C,B,A);

}

}

B、

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);

}

}

C、

void Hanoi(int n,int C,int B,int A){

if(n>0)

{

Hanoi(n-1,A,C,B);

Move(n,a,b);

Hanoi(n-1,C,B,A);

}

D、

void Hanoi(int n, int C,int A,int B)

{

if(n>0)
{
Hanoi(n-1,A,C,B);

Move(n,a,b);

Hanoi(n-1,C,B,A)

}

5.分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。这要求原问题和子问题(C)。

A.问题规模相同,问题性质相同

B.问题规模相同,问题性质不同

C.问题规模不同,问题性质相同

D.问题规模不同,问题性质不同

分治法是采用递归的思想,将大问题转化为小问题,然后由小问题(子问题之间相互独立且与原问题的形式相同)构造出大问题的解。

分治法的特性:

(1)问题的规模缩小到一定程度可以很容易的解决;

(2)可以分解为若干个规模较小的相同问题;

(3)子问题的解可以合并为该问题的解;

(4)该问题分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题

6、在寻找n个元素中第k小元素问题中,如快速排序算法思想,运用分治算法对n个元素进行划分,如何选择划分基准?下面(D)答案解释最合理。

A.随机选择一个元素作为划分基准

B.取子序列的第一个元素作为划分基准

C.用中位数的中位数方法寻找划分基准

D.以上皆可行,但不同方法,算法复杂度上界可能不同

取第一个元素的话时间复杂度为(Onlog2n),P81。

7、二分搜索算法是利用( A )实现的算法。

A、分治策略 B、动态规划法 C、贪心法 D、回溯法

二分搜索(二分查找):搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。但是前提是搜索的数组是有序的。

8、Strassen矩阵乘法是利用( A )实现的算法。

A、分治策略 B、动态规划法 C、贪心法 D、回溯法

9、使用分治法求解不需要满足的条件是( A )。

A、子问题必须是一样的       B、子问题不能够重复

C、子问题的解可以合并       D、原问题和子问题使用相同的方法解

规模改变,问题性质不变

10、实现合并排序利用的算法是( A )

A、分治策略 B、动态规划法 C、贪心法 D、回溯法

先分解:将序列分解为length长度的若干子问题

求解子问题:将相邻的两个子问题合并为一个有序的子序列

合并:合并不需要执行任何操作

11、实现大整数的乘法是利用的算法( C )

A、贪心法 B、动态规划法 C、分治策略 D、回溯法

12.(C)是贪心算法的基本要素。

A.重叠子问题            B.构造最优解

C.贪心选择性质          D.定义最优解

贪心算法基本要素:

(1)贪心选择性质:每一步所做的贪心选择最终导致问题的整体最优解。

(2)最优子结构性质:一个问题的最优解包含其子问题的最优解。

13.采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为(D)。

A.O(n)          B.O(log2n)          C.O(n3)         D.O(nlog2n)

有一批集装箱要装上一艘载重量为C的轮船,其中集装箱i的重量为Wi。要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。

14.一棵哈夫曼树共有215个结点,对其进行哈夫曼编码,共能得到(B )个不同的码字。

A.107               B.108           C.214           D.215

哈夫曼树中只有度为零和度为二的节点,没有度为一的结点,且n0=n2+1(非空二叉树的性质),n=n0+n2

只有叶子结点能够产生码字,也就是计算度为零的结点。

15、哈弗曼编码的贪心算法所需的计算时间为(B)。

A、O(n2n)         B、O(nlog2n)  C、O(2n)      D、O(n)

Onlog2n

16、背包问题的贪心算法所需的计算时间为(B)

A、O(n2n)         B、O(nlog2n)  C、O(2n)      D、O(n)

问题描述:与0 / 1背包问题不同的是,完全背包问题可以装入一部分物品进入背包,也就是说背包一定可以装满。

方案:将物品以单位价值从大到小排序,除最后一个物品只取一部分之外,其他物品要么全拿,要么不拿

时间复杂度:快速排序(Onlog2n)

while循环(n)

所以时间复杂度为(Onlog2n)

17、以下不属于贪心算法的是( D)

A.Prim算法          B.Kruskal算法       C.Dijkstra算法      D.深度优先遍历

(1)Prim算法 :按照顶点规定

Kruskal算法:按照边规定

Dijkstra算法:单源最短路径

深度优先遍历:回溯,走不通的时候回溯

18、下面问题( B )不能使用贪心法解决。

A、单源最短路径问题             B、N皇后问题

C、最小生成树问题               D、背包问题

N皇后为递归。

19、关于0/1背包问题,以下描述正确的是(D)。

A.可以使用贪心算法找到最优解

B.能找到多项式时间的有效算法

C.使用教材介绍的动态规划方法可求解任意0-1背包问题

D.对于同一背包与相同的物品,背包问题取得的总价值一定大于等于做0/1背包问题

A:穷举法(结合求解幂集的方法)

C:动态规划可以求解完全背包问题:  每种物品可以挑选任意多件。

D:背包问题中背包一定能够装满,但是0/1背包不能(https://www.cnblogs.com/zhai1997/p/12121834.html)。

20.一个问题可用动态规划算法或贪心算法求解的关键特征是问题的( C)。

A.贪心选择性质      B.重叠子问题        C.最优子结构性质        D.定义最优解

最优子结构性质:一个问题的最优解包含其子问题的最优解。

21.能采用贪心算法求最优解的问题,一般具有的重要性质为:( A )

A、最优子结构性质与贪心选择性质 B、重叠子问题性质与贪心选择性质

C、最优子结构性质与重叠子问题性质 D、预排序与递归调用

贪心算法基本要素:

(1)贪心选择性质:每一步所做的贪心选择最终导致问题的整体最优解。

(2)最优子结构性质:一个问题的最优解包含其子问题的最优解。

22. ( D )是贪心算法与动态规划算法的共同点。

A.重叠子问题 B、构造最优解 C、贪心选择性质 D、最优子结构性质

最优子结构性质:一个问题的最优解包含其子问题的最优解。

23.下列算法中不能解决0/1背包问题的是(A)

A、贪心法B、动态规划C、回溯法D、分支限界法

(1)贪心算法在某些情况下会出错。

(2)0-1背包问题可以用动态规划、回溯法和分支限界法这三种任意一种算法策略来求解。

24.下列算法中通常以自底向上的方式求解最优解的是( B )。

A.分去限界法 B、动态规划法 C、贪心法 D、回溯法

25.贪心算法与动态规划算法的主要区别是( B )。

A、最优子结构 B、贪心选择性质 C、构造最优解 D、定义最优解

贪心算法基本要素:

(1)贪心选择性质:每一步所做的贪心选择最终导致问题的整体最优解。

(2)最优子结构性质:一个问题的最优解包含其子问题的最优解。

而动态规划也具有最优子结构性质。

26.动态规划算法的基本要素为( C )

A、最优子结构性质与贪心选择性质 B、重叠子问题性质与贪心选择性质

C、最优子结构性质与重叠子问题性质 D、预排序与递归调用

(1)子问题重叠性(要与分治法区别,分治的子问题是相互独立的)

(2)最优子结构性质

27.关于回溯法以下叙述中不正确的是(C)。

A.回溯法有“通用解题法”之称,它可以系统地搜索一个问题的所有解或任意解

B.回溯法是一种既带系统性又带有跳跃性的搜索算法

C.回溯算法需要借助队列这种结构来保存从根结点到当前扩展结点的路径

D.回溯算法在生成解空间的任一结点时,先判断该结点是否可能包含问题的解,如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向祖先结点回溯

C:借助于树结构

28、下列算法中通常以深度优先方式系统搜索问题解的是( D )。

A、备忘录法 B、动态规划法 C、贪心法 D、回溯法

回溯法:深度优先

分支限界法:广度优先

29.下面哪种函数是回溯法中为避免无效搜索采取的策略( B )

A、递归函数 B、剪枝函数 C、随机数函数 D、搜索函数

避免无效搜索的方法:

(1)约束函数:减去不满足约束的子树

(2)限界函数:剪去得不到解或最优解的子树

30、0-1背包问题的回溯算法所需的计算时间为( C )

A、O(n2)  B、O(nlogn)  C、O(2n)  D、O(n)

31.以深度优先方式系统搜索问题解的算法称为 ( D ) 。

A、分支界限算法 B、概率算法 C、贪心算法 D、回溯算法

回溯法:深度优先

分支限界法:广度优先

32.回溯法在问题的解空间树中,按( D )策略,从根结点出发搜索解空间树。

A、广度优先 B、活结点优先 C、扩展结点优先 D、深度优先

回溯法:深度优先

分支限界法:广度优先

33.分支限界法在问题的解空间树中,按( A )策略,从根结点出发搜索解空间树。

A.广度优先 B. 活结点优先 C.扩展结点优先 D. 深度优先

回溯法:深度优先

分支限界法:广度优先

34.采用广度优先策略搜索的算法是( A )。

A、分支界限法 B、动态规划法 C、贪心法 D、回溯法

回溯法:深度优先

分支限界法:广度优先

35.常见的两种分枝限界法为(D )。

A.广度优先分枝限界法与深度优先分枝限界法

B.队列式(FIFO)分枝限界法与堆栈式分枝限界法

C.排列树法与子集树法

D.队列式(FIFO)分枝限界法与优先队列式分枝限界法

P185

36.最大效益优先是( A )的一搜索方式。

A、分支界限法 B、动态规划法 C、贪心法 D、回溯法

37.下面不是分支界限法搜索方式的是( D )。

A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先

回溯法:深度优先

分支限界法:广度优先

38.分支限界法解0/1背包问题时,优先级队列的组织形式是( B )。

A、小根堆   B、大根堆     C、栈        D、循环链表

最大优先队列:大根堆

最小优先队列:小根堆

队列式分支限界法:队列

39、优先队列式分支限界法选取扩展结点的原则是( C )。

A、先进先出 B、后进先出 C、结点的优先级 D、随机

选取优先级最高的结点作为当前的扩展结点。

原文地址:https://www.cnblogs.com/zhai1997/p/12122085.html

时间: 2024-10-11 10:50:15

算法习题——选择题的相关文章

2015/10/13 算法习题:最大子列和问题

已经正式开始学习数据结构和算法,先学了网易云课堂上的浙江大学的数据结构课,是陈越和何钦铭上的,了解了什么是数据结构和算法后,学习了一些时间空间复杂度分析的技巧,结合之前马虎掌握的学习,先从简单的题目入手学习. 题目是这样的: 给定了一个n个整数组成的序列,求它各个子列中,子列和最大的值. 输入:输入n个整数组成的序列 要求输出最大子列和. 示例: 输入: -2 11 -4 13 -5 -2 输出: 20 做出这题的难度不是很大,至少很容易可以做到暴力求解,然而暴力求解的时间复杂度是很大的. 我用

排序算法习题汇总

1.冒泡排序 对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] class BubbleSort { public: int* bubbleSort(int* A, int n) { // write code here for(int i=0;i<n-1;i++){ int k=0; for(int j=0;j<n-i-1;j++){ if(A[j]&

算法习题---线性表之单链表逆序打印

一:题目 逆序打印单链表中的数据,假设指针指向单链表的开始结点 二:思路 1.可以使用递归方法,来进行数据打印 2.可以借助数组空间,获取长度,逆序打印数组 3.若是可以,对链表数据使用头插法,逆序排列,然后正序打印即可 三:算法实现(这里使用方法一:递归实现简单易懂) #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 #define OK 1 #def

算法习题---线性表之单链表的查找

一:问题 已知一个带头结点的单链表,结点结构为(data,link)假设该链表只给出了头指针list,在不改变链表的前提下,设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数),若查找成功,算法输出该结点的data域的值,并返回1,否则,只返回0. 注意: 这里的链表中没有给出链表长度哟 二:思路 设置两个指针p.q,分别指向该链表的第一个元素(头结点的下一个元素)和头结点,一个整数num(初值为1),p向后移动一个位置num值加1,如果num值大于k,则p,q一起移动,p移

算法习题---线性表之数组实现循环移动

一:问题 设将n(n>1)个整数存放到一维数组R中,试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移p(0<p<n)个位置,即把R中的数据序列由(x0,x1,…,xn-1)变换为(xp,xp+1,…,xn-1,x0,x1,…,x). 二:思考 要实现R中序列循环左移P个位置,只需先将R中前P个元素逆置,再将剩下的元素逆置,最后将R中所有的元素再整体做一次逆置操作即可,本题算法描述如下: (一)步骤一:将前P个元素逆置 (二)步骤二:将后P个元素逆置 (三)步骤三:

算法习题---字符串的全排序列

一:什么是全排列 排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 二:全排列实现思路 (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀):

算法习题分类

My Travel Of Acm! 早早的结束了考试,最近任务不是那么重,就花点时间整理了一下大二上学期学习过的一些算法 --2019-01-06 分类 知识清单 数据结构 树状数组 STL 差分数组 树链剖分 图论 图的连通性问题 2-SAT LCA 字符串 AC自动机 KMP 动态规划 动态规划(基础)       原文地址:https://www.cnblogs.com/violet-acmer/p/10228028.html

一个算法习题学习的好去处-有不同语言的实现

这不是个人传销,而是在学习过程中发现的一个比较好的地方,因此向大家推荐一下,希望能有所帮助- 虽然只有一个链接,但是这个链接的重量就在那里,不知道能发向首页不?? 为了凑字数,下面给出了一篇在上述网站中的一个题目解析: ------------------------------ 链接地址:http://openhome.cc/Gossip/AlgorithmGossip/MathPI.htm From [email protected] Algorithm Gossip: 蒙地卡羅法求 PI

PHP 算法习题

<?php/*假设某人有100000现金.每经过一次路口需要进行一次交费.交费规则为当他现金大于50000时每次需要交5%,如果现金小于等于50000时每次交5000.请写一程序计算此人可以经过该路口多少次.*/$money = 100000; for($i=0;$money>=5000;$i++){ if($money>=50000){ $money=$money-$money*0.05; }else if($money>=5000){ $money -= 5000; }} ec