文档库 最新最全的文档下载
当前位置:文档库 › 算法练习题-分章节-带答案

算法练习题-分章节-带答案

.

.

算法练习题---算法概述

一、选择题

1、下面关于算法的描述,正确的是( )

A 、一个算法只能有一个输入

B 、算法只能用框图来表示

C 、一个算法的执行步骤可以是无限的

D 、一个完整的算法,不管用什么方法来表示,都至少有一个输出结果

2、一位爱好程序设计的同学,想通过程序设计解决“韩信点兵”的问题,他制定的如下工作过程中,更恰当的是( )

A 、设计算法,编写程序,提出问题,运行程序,得到答案

B 、分析问题,编写程序,设计算法,运行程序,得到答案

C 、分析问题,设计算法,编写程序,运行程序,得到答案

D 、设计算法,提出问题,编写程序,运行程序,得到答案 3、下面说法正确的是( )

A 、算法+数据结构=程序

B 、算法就是程序

C 、数据结构就是程序

D 、算法包括数据结构 4、衡量一个算法好坏的标准是( )。

A 、运行速度快

B 、占用空间少

C 、时间复杂度低

D 、代码短 5、解决一个问题通常有多种方法。若说一个算法“有效”是指( )。 A 、这个算法能在一定的时间和空间资源限制内将问题解决 B 、这个算法能在人的反应时间内将问题解决 C 、这个算法比其他已知算法都更快地将问题解决 D 、A 和C

6、算法分析中,记号O 表示( ), 记号Ω表示( )。 A.渐进下界 B.渐进上界 C.非紧上界 D.非紧下界

7、以下关于渐进记号的性质是正确的有:( ) A.f (n)(g(n)),g(n)(h(n))f (n)(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)}) D.f (n)O(g(n))g(n)O(f (n))=?=

8、记号O 的定义正确的是( )。

A. O(g(n)) = { f(n) | 存在正常数c 和n0使得对所有n ≥n0有:0≤ f(n) ≤ cg(n) };

B. O(g(n)) = { f(n) | 存在正常数c 和n0使得对所有n ≥n0有:0≤ cg(n) ≤ f(n) };

C. O(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n≥n0有0 ≤f(n)

D. O(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n≥n0有:0 ≤cg(n) < f(n) };

9、记号Ω的定义正确的是()。

A. O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n≥n0有:0≤ f(n) ≤ cg(n) };B.O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n≥n0有:0≤ cg(n) ≤ f(n) };C.O(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n≥n0有:

0 ≤f(n)

D.O(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n≥n0有:

0 ≤cg(n) < f(n) };

二、填空题

1、算法的性质包括输入、输出、、、有限性。

4、算法的复杂性是的度量,是评价算法优劣的重要依据。

6、计算机的资源最重要的是时间和空间资源。因而,算法的复杂性有和之分。

7、算法复杂度依赖于三方面:、和算法本身。

8、程序是用某种程序设计语言的具体实现。

9、算法是指解决问题的或步骤的描述。

11、计算一个算法时间复杂度通常可以计算、或计算步。16、任何可用计算机求解的问题所需的时间都与其有关。

算法练习题---递归与分治策略

一、选择题

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

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

A 、分治策略

B 、动态规划法

C 、贪心法

D 、回溯法 12、以下不可以使用分治法求解的是( )。

A 棋盘覆盖问题

B 选择问题

C 归并排序

D 0/1背包问题 13、实现循环赛日程表利用的算法是( )。

A 、分治策略

B 、动态规划法

C 、贪心法

D 、回溯法 14、实现棋盘覆盖算法利用的算法是( )。

A 、分治法

B 、动态规划法

C 、贪心法

D 、回溯法 15、Strassen 矩阵乘法是利用( )实现的算法。

A 、分治策略

B 、动态规划法

C 、贪心法

D 、回溯法 16、使用分治法求解不需要满足的条件是()。 A 子问题必须是一样的 B 子问题不能够重复

C 子问题的解可以合并

D 原问题和子问题使用相同的方法解 17、实现合并排序利用的算法是( )。

A 、分治策略

B 、动态规划法

C 、贪心法

D 、回溯法 18、实现大整数的乘法是利用的算法( )。

A、贪心法

B、动态规划法

C、分治策略

D、回溯法

二、填空题

5、分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相且与原问题相同。

10、从分治法的一般设计模式可以看出,用它设计出的程序一般是。

14、快速排序算法是基于的一种排序算法。

17、快速排序算法的性能取决于

三、简答题

3、分治法所能解决的问题一般具有的几个特征是:

答:(1)该问题的规模缩小到一定的程度就可以容易地解决;

(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;

(3)利用该问题分解出的子问题的解可以合并为该问题的解;

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

4、分治法与动态规划法的异同。

答:相同点:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

不同点:适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解的问题,经分解得到的子问题往往是互相独立的。

8、老板有一袋金块(共n块,n是2的幂(n>=2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重的金块。

答:n≤2 ,识别出最重和最轻的金块,一次比较就足够了。

n>2,

第一步,把这袋金块平分成两个小袋A和B。

第二步,分别找出在A和B 中最重和最轻的金块。设A中最重和最轻的金块分别为HA与LA,以此类推,B中最重和最轻的金块分别为HB和LB。

第三步,通过比较HA和HB,可以找到所有金块中最重的;通过比较LA和LB,可以找到所有金块中最轻的。在第二步中,若n>2,则递归地应用分而治之方法。

9、Tom很顽皮。一天,他把假币投到储钱罐里。之后,他担心爸爸揍它,想从 N个钱币里找出那个假币。他知道假币的重量比其他钱币轻,但不知道如何找到它,于是禁不住哭了。也许你能帮他。请描述一个通过使用天平找到假币的算法,并分析你算法的运行时间。

11、对下面的递归算法,写出调用f(4)的执行结果。

void f(int k)

{ if( k>0 )

{ printf("%d\n ",k);

f(k-1);

f(k-1);

}

}

四、算法填空

5.快速排序

void QuickSort (int a[], int p, int r)

{ if (p

{ int q=Partition(a,p,r);

; //对左半段排序

; //对右半段排序

}

}

6.排列问题

void perm(int list[], int k, int m )

{ //产生[list[k:m]的所有排列

if( )

{ //只剩下一个元素

for (int i=0;i<=m;i++) cout<

}

else //还有多个元素待排列,递归产生排列

for ( )

{ swap(list[k],list[i]);

;

swap(list[k],list[i]);

}

}

五、算法题

1. 给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x,返回其在数组中的位置,如果未找到返回-1。写出二分搜索的算法,并分析其时间复杂度。template

int BinarySearch(Type a[], const Type& x, int n)

{//在a[0:n]中搜索x,找到x时返回其在数组中的位置,否则返回-1

Int left=0; int right=n-1;

While (left<=right)

{ int middle=(left+right)/2;

if (x==a[middle]) return middle;

if (x>a[middle]) left=middle+1;

else right=middle-1;

}

Return -1;

}

时间复杂性为O(logn)

2. 利用分治算法写出合并排序的算法,并分析其时间复杂度

void MergeSort(Type a[], int left, int right)

{ if (left

{ int i=(left+right)/2; //取中点

mergeSort(a, left, i);

mergeSort(a, i+1, right);

merge(a, b, left, i, right); //合并到数组b

copy(a, b, left, right); //复制回数组a

}

}

算法在最坏情况下的时间复杂度为O(nlogn)。

算法练习题---动态规划

一、选择题

19、下列不是动态规划算法基本步骤的是()。

A、找出最优解的性质

B、构造最优解

C、算出最优解

D、定义最优解

20、最长公共子序列算法利用的算法是()。

A、分支界限法

B、动态规划法

C、贪心法

D、回溯法

21、动态规划算法的基本要素为()

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

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

22、矩阵连乘问题的算法可由()设计实现。

A、分支界限算法

B、动态规划算法

C、贪心算法 D.分治法

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

A、备忘录法

B、动态规划法

C、贪心法

D、回溯法

24、应用Johnson法则的流水作业调度采用的算法是()

A. 贪心算法

B. 分支限界法

C.分治法

D. 动态规划算法

25、下列不是动态规划算法基本步骤的是()。题目不好

A、找出最优解的性质

B、构造最优解

C、算出最优解

D、定义最优解

二、填空题

2、动态规划算法的基本思想就将待求问题、先求解子问题,然后从这些子问题的解得到原问题的解。

3、设计动态规划算法的4个步骤:(1)_,并刻画其结构特征。

(2)。(3)。(4)根据计算最优值得到的信息,。

12、解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是,需要排序的是,。

18、下面程序段的所需要的计算时间为。

int MaxSum(int n, int *a, int &besti, int &bestj)

{ int sum=0;

for(int i=1;i<=n;i++)

{ int thissum=0;

for(int j=i;j<=n;j++)

{ thissum += a[j];

if(thissum>sum)

{ sum=thissum; besti=i; bestj=j; }

}

}

return sum;

}

21、所谓最优子结构性质是指。

三、简答题

1、请叙述动态规划算法与贪心算法的异同。

答:共同点:都需要最优子结构性质,

不同点:

(1)动态规划:每一步作一个选择—依赖于子问题的解。

贪心方法:每一步作一个选择—不依赖于子问题的解。

(2)动态规划方法的条件:子问题的重叠性质。

贪心方法的条件:最优子结构性质;贪心选择性质。

(3)动态规划:自底向上求解;

贪心方法:自顶向下求解。

2、设计动态规划算法的主要步骤为:

答:(1)找出最优解的性质,并刻划其结构特征。(2)递归地定义最优值。(3)以自底向上的方式计算出最优值。(4)根据计算最优值时得到的信息,构造最优解。

4、分治法与动态规划法的异同。

答:相同点:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

不同点:适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解的问题,经分解得到的子问题往往是互相独立的。

四、算法填空

2.最大子段和: 动态规划算法

int MaxSum(int n, int a[])

{ int sum=0, b=0; //sum存储当前最大的b[j], b存储b[j]

for(int j=1; j<=n; j++)

{ if (b>0) b += a[j] ;

else ; //一旦某个区段和为负,则从下一个位置累和 if(b>sum) sum=b;

}

return sum ; }

算法练习题---贪心算法

一、选择题

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

A. 最优子结构性质与贪心选择性质 B .重叠子问题性质与贪心选择性质 C .最优子结构性质与重叠子问题性质 D. 预排序与递归调用 27、贪心算法与动态规划算法的共同点是( )。

A 、重叠子问题

B 、构造最优解

C 、贪心选择性质

D 、最优子结构性质 28、贪心算法与动态规划算法的主要区别是( )。

A 、最优子结构

B 、贪心选择性质

C 、构造最优解

D 、定义最优解 29、哈弗曼编码的贪心算法所需的计算时间为( )。 A 、O (n2n ) B 、O (nlogn ) C 、O (2n ) D 、O (n ) 30、下面是贪心算法的基本要素的是( )。

A 、重叠子问题

B 、构造最优解

C 、贪心选择性质

D 、定义最优解 31、下面问题(B )不能使用贪心法解决。

A 单源最短路径问题

B N 皇后问题

C 最小花费生成树问题

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

A 、O (n2n )

B 、O (nlogn )

C 、O (2n )

D 、O (n ) 45、下列算法中不能解决0/1背包问题的是( ) A 贪心法 B 动态规划 C 回溯法 D 分支限界法

二、填空题

19、有11个待安排的活动,它们具有下表所示的开始时间与结束时间,如果以贪心算法求解

这些活动的最优安排(即为活动安排问题:在所给的活动集合中选出最大的相容活动子集合),得到的最大相容活动子集合为活动 。

20、所谓贪心选择性质是指 所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到 。

21、所谓最优子结构性质是指 问题的最优解包含了其子问题的最优解 。

14

13

12

11

10

9

8

7

6

5

4

f[i]

12 2 8 8 6 5 3 5 0 3 1 S[i] 11 10 9 8 7 6 5 4 3 2 1 i

四、算法填空

1.背包问题的贪心算法

void Knapsack(int n,float M,float v[],float w[],float x[]) { Sort(n,v,w);

int i; float c=M;

for (i=1;i<=n;i++) x[i]=0;

for (i=1;i<=n;i++)

{ if (w[i]>c) break;

x[i]=1;

;

}

;

}

3.贪心算法求装载问题

void Loading(int x[], int w[], int c, int n)

{ int *t = new int [n+1];

;

for (int i = 1; i <= n; i++) x[i] = 0;

for (int i = 1; i <= n && w[t[i]] <= c; i++)

{ x[t[i]] = 1;

;

}

}

4.贪心算法求活动安排问题

template

void GreedySelector(int n, Type s[], Type f[], bool A[]) { ;

int j=1;

for (int i=2;i<=n;i++)

{ if (s[i]>=f[j])

{ ; ; }

else A[i]=false;

}

}

五、算法题

5、试用贪心算法求解下列问题:将正整数n分解为若干个互不相同的自然数之和,使这些自然数的乘积最大。

void dicomp(int n,int a[])

{ k=1;

if(n<3)

{ a[1]=0; return; }

if(n<5)

{ a[k]=1; a[++k]=n-1; return;}

a[1]=2;

n-=2;

while(n>a[k])

{ k++; a[k]=a[k-1]+1; n-=a[k]; }

if(n==a[k])

{ a[k]++; n--;}

for(int i=0;i

}

算法练习题—回溯法

一、选择题

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

A.广度优先

B. 活结点优先

C.扩展结点优先

D. 深度优先

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

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

35、回溯法的效率不依赖于以下哪一个因素?()

A. 产生x[k]的时间;

B.满足显式约束的x[k]值的个数;

C. 问题的解空间的形式;

D.计算上界函数bound的时间;

36、回溯法的效率不依赖于下列哪些因素()

A.满足显约束的值的个数

B. 计算约束函数的时间

C. 计算限界函数的时间

D. 确定解空间的时间

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

A、备忘录法

B、动态规划法

C、贪心法

D、回溯法

38、回溯法搜索状态空间树是按照()的顺序。

A 中序遍历

B 广度优先遍历

C 深度优先遍历

D 层次优先遍历

39、程序块()是回溯法中遍历排列树的算法框架程序。

二、填空题

12、解决0/1

背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的

是,需要排序的是,。

13、使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的界,N皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标函数的界进行裁剪的是,只使用约束条件进行裁剪的是。

15、回溯法是一种既带有又带有的搜索算法。

22、回溯法是指。

23、用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为。

24、回溯法的算法框架按照问题的解空间一般分为算法框架与算法框架。

25、用回溯法解0/1背包问题时,该问题的解空间结构为结构。

26、用回溯法解批处理作业调度问题时,该问题的解空间结构为结构。

27、旅行售货员问题的解空间树是。

28、用回溯法解图的m着色问题时,使用下面的函数OK检查当前扩展结点的每一个儿子所相应的颜色的可用性,则需耗时(渐进时间上限)。

Bool Color::OK(int k)

{

for(int j=1;j<=n;j++)

if((a[k][j]= =1)&&(x[j]= =x[k])) return false;

return true;

}

三、简答题

5、分支限界法与回溯法的异同

答:相同点:都是一种在问题的解空间树T中搜索问题解的算法。

不同点:(1)求解目标不同;(2)搜索方式不同;

(3)对扩展结点的扩展方式不同;(4)存储空间的要求不同。

四、算法填空

10.用回溯法解0/1背包问题时,计算结点的上界的函数如下所示,请在空格中填入合适的内容:

Typep Knap::Bound(int i) // 计算上界

{ Typew cleft = c - cw; // 剩余容量

Typep b = cp; // 结点的上界

// 以物品单位重量价值递减序装入物品

while (i <= n && w[i] <= cleft)

{ ;

;

;

}

// 装满背包

if (i <= n)

return b;

}

五、算法题

3.N皇后回溯法

bool Queen::Place(int k) //检查x[k]位置是否合法

{

for (int j=1;j

if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k]))

return false;

return true;

}

void Queen::Backtrack(int t)

{ if (t>n) sum++;

else

for (int i=1;i<=n;i++)

{ x[t]=i;

if ( 约束函数 ) Backtrack(t+1);

}

}

4. 请写出用回溯法解装载问题的函数。

装载问题:有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i

的重量为wi,且

12

1

n

i

i

w c c

=

≤+

。装载问题要求确定是否有一个合理的装载方案可将这n个

集装箱装上这2艘轮船。如果有,找出一种装载方案。

void backtrack (int i) // 搜索第i层结点

{ if (i > n) // 到达叶结点

if(cw>bestw) //更新最优解bestx,bestw; return; { for(j=1;j<=n;j++) bestx[j]=x[j];

Bestw=cw;

}

r -= w[i];

if (cw + w[i] <= c) // 搜索左子树

{ x[i] = 1; cw += w[i];

backtrack(i + 1); cw -= w[i];

}

if (cw + r > bestw) // 搜索右子树

{ x[i] = 0; backtrack(i + 1); }

r += w[i];

}

算法练习题---分支限界法

一、选择题

40、常见的两种分支限界法为()

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

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

C. 排列树法与子集树法;

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

41、分支限界法在问题的解空间树中,按()策略,从根结点出发搜索解空间树。A.广度优先 B. 活结点优先 C.扩展结点优先 D. 深度优先

42、下面不是分支界限法搜索方式的是()。

A、广度优先

B、最小耗费优先

C、最大效益优先

D、深度优先

43、分支限界法解旅行售货员问题时,活结点表的组织形式是()。

A、最小堆

B、最大堆

C、栈

D、数组

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

A、先进先出

B、后进先出

C、结点的优先级

D、随机

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

A 贪心法

B 动态规划

C 回溯法

D 分支限界法

二、填空题

12、解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是,需要排序的是,。

三、简答题

5、分支限界法与回溯法的异同

答: 相同点:都是一种在问题的解空间树T 中搜索问题解的算法。

不同点:(1)求解目标不同; (2)搜索方式不同;

(3)对扩展结点的扩展方式不同; (4)存储空间的要求不同。

6、用分支限界法设计算法的步骤是:

答: (1)针对所给问题,定义问题的解空间(对解进行编码);分

(2)确定易于搜索的解空间结构(按树或图组织解) ;

(3)以广度优先或以最小耗费(最大收益)优先的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

7、常见的两种分支限界法的算法框架

答:(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO )原则选取下一个节点为扩展节点。

(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

10、用分支限界法解装载问题时,对算法进行了一些改进,下面的程序段给出了改进部分;试说明斜线部分完成什么功能,以及这样做的原因,即采用这样的方式,算法在执行上有什么不同。

答:斜线标识的部分完成的功能为:提前更新bestw 值;

这样做可以尽早的进行对右子树的剪枝。具体为:算法Maxloading 初始时将bestw 设置为0,直到搜索到第一个叶结点时才更新bestw 。因此在算法搜索到第一个叶子结点之前,总有bestw=0,r>0 故Ew+r>bestw 总是成立。也就是说,此时右子树测试不起作用。

为了使上述右子树测试尽早生效,应提早更新bestw 。又知算法最终找到的最优值是所求问题的子集树中所有可行结点相应重量的最大值。

而结点所相应得重量仅在搜索进入左子树是

增加,因此,可以在算法每一次进入左子树时更新bestw的值。教育之通病是教用脑的人不用手,不教用手的人用脑,所以一无所能。教育革命的对策是手脑联盟,结果是手与脑的力量都可以大到不可思议。

相关文档
相关文档 最新文档