文档库 最新最全的文档下载
当前位置:文档库 › 算法设计与分析复习题

算法设计与分析复习题

算法设计与分析复习题
算法设计与分析复习题

题型

一、填空题(共20分,10小题)

二、选择题(共10分,10小题)

三、判断题(共10分,10小题)

四、算法填空(共30分,5小题,每题2空)

五、程序设计(共30分,3题)

一。选择题

1、递推实施步骤一般为确定递推变量、( C )、确定初始(边界)条件和

对递推过程进行控制。

A .确定出口

B .给出迭代部分

C .建立递推关系

D .设置递推条件

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

A 、找出最优解的性质

B 、构造最优解

C 、算出最优解

D 、定义最优解

3、控制结构包括顺序结构、选择结构、循环结构和( A )。

A .模块调用

B .逆序结构

C .调用函数

D .判断结构

4、在下列算法中有时找不到问题解的是( B )。

A 、蒙特卡罗算法

B 、拉斯维加斯算法

C 、舍伍德算法

D 、数值概率算法

5. 有一猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了1个。第2天早

上又将剩下的桃子吃掉一半,又多吃了1个。以后每天早上都吃了前一天剩下的一半后

又多吃1个。到第10天早上想再吃时,见只剩下1个桃子了。求第1天共摘了多少个

桃子。设第k 天的桃子数是t(k),则有递推关系式为( A )。

A .t(k)=2*(t(k+1)+1) (k=1,2,…,9),初始条件:t(10)=1

B .t(k+1)=2*(t(k)+1) (k=1,2,…,9),初始条件:t(10)=1

C .t(k)=1/2*(t(k+1)+1) (k=1,2,…,9),初始条件:t(10)=1

D .t(k)=2*(t(k+1)-1) (k=1,2,…,9),初始条件:t(10)=1

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

A 、备忘录法

B 、动态规划法

C 、贪心法

D 、回溯法

7、衡量一个算法好坏的标准是(C )。

A 运行速度快

B 占用空间少

C 时间复杂度低

D 代码短

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

A .中序遍历

B .广度优先遍历

C .深度优先遍历

D .层次优先遍历

9. 实现循环赛日程表利用的算法是( A )。

A 、分治策略

B 、动态规划法

C 、贪心法

D 、回溯法

10、下列随机算法中运行时有时候成功有时候失败的是(C )

A 数值概率算法

B 舍伍德算法

C 拉斯维加斯算法

D 蒙特卡罗算法

11.关于时间复杂度的运算规则, )()(g O f O ( D )。

A .)),(min(g f O

B .))(max(g f O +

C .)),(max(g f O

D .)(fg O

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

A 、备忘录法

B 、动态规划法

C 、贪心法

D 、回溯法

13.备忘录方法是那种算法的变形。( B )

A 、分治法

B 、动态规划法

C 、贪心法

D 、回溯法

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

A 、O (n2n )

B 、O (nlogn )

C 、O (2n )

D 、O (n )

15.有n 个集装箱要装上两艘载重量分别为1c ,2c 的轮船,其中集装箱i 的重量为i w ,那

么只要∑=+≤n i i c c w

121,+∈N w c c i ,,21且 (且不考虑集装箱的体积)。

设装载量为1c 的船最多可装载max 1c ,如果满足不等式( A ),则装载问题有解。

A .11

12max c c c w

n i i ∑=≤≤- B . 1112max c c c w n

i i ∑=≥≥- C .1112max c c c w

n i i ∑=≤≤- D .2112max c c c w n

i i ∑=≤≤-

16.最长公共子序列算法利用的算法是( B )。

A 、分支界限法

B 、动态规划法

C 、贪心法

D 、回溯法

17.实现棋盘覆盖算法利用的算法是( A )。

A 、分治法

B 、动态规划法

C 、贪心法

D 、回溯法

18.下面是贪心算法的基本要素的是( C )。

A 、重叠子问题

B 、构造最优解

C 、贪心选择性质

D 、定义最优解

19.回溯法的效率不依赖于下列哪些因素( D )

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

B. 计算约束函数的时间

C. 计算限界函数的时

间 D. 确定解空间的时间

20. 对n 个数进行快速排序法的时间复杂度为( D )。

A .)(n O

B .)(2n O

C .)log (n n O

D .)log (2n n O

21、用蒙特卡罗法计算定积分?=b

a

dx x f s )(,其中

)](max[],,[,)(0,x f d b a x d x f b a ≥∈<<<, 如右图。产生n (n 足够大)个随机分

布在长方形ABCD

上的随机点(x ,y ),其中x 是随机分布在[a,b]上的随

机数,y 是随机分布在[0,h]上的随机数。设其中落在曲

边梯形abEF 上的随机数为m ,则定积分)(x f 的计算公

式为( B )。

F

C h

D b a f (x )

E

A .

d a b n m )(- B .h a b n

m )(- C .h a b m n )(- D . d a b m n )(-

22、蒙特卡罗算法是( B )的一种。

A 、分支界限算法

B 、概率算法

C 、贪心算法

D 、回溯算法

23.下列哪一种算法不是随机化算法( C )

A. 蒙特卡罗算法

B. 拉斯维加斯算法

C.动态规划算法

D.舍伍德算法

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

A 、重叠子问题

B 、构造最优解

C 、贪心选择性质

D 、最优子结构性质

25. 矩阵连乘问题的算法可由( B )设计实现。

A 、分支界限算法

B 、动态规划算法

C 、贪心算法

D 、回溯算法

26. 算法是满足确定性、可行性、有穷性、零个或多个输入和( D )特性的指令

序列。

A .迭代性

B .循环性

C .唯一输出

D .一个或多个输出

27、借助容量分别为bv 与cv (单位为整数)的两个空杯,用最少的分倒次数把总容

量为偶数a 的酒评分。则该泊松汾酒问题有解的条件是 ( D )。

A .)2/(a cv bv ≥+

B . 2/a 能被bv 与cv 的最大公约数整除

C .bv 与cv 互质

D .)2/(a cv bv ≥+且2/a 能被bv 与cv 的最大公约数整除

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

A 子问题必须是一样的

B 子问题不能够重复

C 子问题的解可以合并

D 原问题和子

问题使用相同的方法解

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

A 单源最短路径问题

B N 皇后问题

C 最小花费生成树问题

D 背包问题

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

A 贪心法

B 动态规划

C 回溯法

D 分支限界法

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

A 中序遍历

B 广度优先遍历

C 深度优先遍历

D 层次优先遍历

33、下列随机算法中运行时有时候成功有时候失败的是(C ) A 数值概率算法 B 舍

伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法

34.实现合并排序利用的算法是( A )。

A 、分治策略

B 、动态规划法

C 、贪心法

D 、回溯法

35.下列是动态规划算法基本要素的是( D )。

A 、定义最优解

B 、构造最优解

C 、算出最优解

D 、子问题 重叠性质

36.下列算法复杂度排序正确的是( C )。

A .)()2()!(n n n O O n O <<

B .)!()()2(n O n O O n n <<

C .)()!()2(n n n O n O O <<

D .)2()!()(n n O n O n O <<

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

A 、分支界限法

B 、动态规划法

C 、贪心法

D 、回溯法

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

A、分治策略

B、动态规划法

C、贪心法

D、回溯法

39、一个递归算法,必须包括( A )。

A.终止条件和递归部分 B.递归部分 C.迭代部分 D.入口

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

A、O(n2n)

B、O(nlogn)

C、O(2n)

D、O(n)

41.一个递归算法,必须包括( B )。

A.递归部分B.终止条件和递归部分C.迭代部分D.入口

42.0-1背包问题的回溯算法所需的计算时间为( A )

A、O(n2n)

B、O(nlogn)

C、O(2n)

D、O(n)

43.采用最大效益优先搜索方式的算法是( A )。

A、分支界限法

B、动态规划法

C、贪心法

D、回溯法

44.衡量一个算法好坏的标准是( C )。

A.运行速度快 B.占用空间少 C.时间复杂度低 D.代码短

45. 实现最大子段和利用的算法是( B )。

A、分治策略

B、动态规划法

C、贪心法

D、回溯法

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

A、先进先出

B、后进先出

C、结点的优先级

D、随机

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

A.枚举法 B.动态规划法 C.贪心法 D.回溯法

48、广度优先是( A )的一搜索方式。

A、分支界限法

B、动态规划法

C、贪心法

D、回溯法

49、舍伍德算法是( B )的一种。

A、分支界限算法

B、概率算法

C、贪心算法

D、回溯算法

50、在下列算法中有时找不到问题解的是( B )。

A、蒙特卡罗算法

B、拉斯维加斯算法

C、舍伍德算法

D、数值概率算法

51下列哪一种算法是随机化算法( D )

A. 贪心算法

B. 回溯法

C.动态规划算法

D.舍伍德算法

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

( B )。

A、重叠子问题

B、最优子结构性质

C、贪心选择性质

D、定义最优解

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

A、O(n2n)

B、O(nlogn)

C、O(2n)

D、O(n)

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

A、分支界限算法

B、概率算法

C、贪心算法

D、回溯算法

55. 实现最长公共子序列利用的算法是( B )。

A、分治策略

B、动态规划法

C、贪心法

D、回溯法

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

A.单源最短路径问题 B.N皇后问题 C.最小花费生成树问题 D.背包问题

4. 背包问题的贪心算法所需的计算时间为( B )。

A.O(n2n) B.O(nlogn) C.O(2n) D.O(n)

57.递推实施步骤一般为确定递推变量、( C )、确定初始(边界)条件和

对递推过程进行控制。

A .确定出口

B .给出迭代部分

C .建立递推关系

D .设置递推条件

58. 矩阵连乘问题的算法可由( B )设计实现。

A .分支界限算法

B .动态规划算法

C .贪心算法

D .回溯算法

二、 填空题

1.算法的复杂性有 时间 复杂性和 空间 复杂性之分。

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

3、算法的“确定性”指的是组成算法的每条 指令 是清晰的,无歧义的。

4.矩阵连乘问题的算法可由 动态规划 设计实现。

5、拉斯维加斯算法找到的解一定是 正确解。

6、算法是指解决问题的 一种方法 或 一个过程 。

7、算法分析是指对算法的 执行时间 与所需空间的估算,定量给出运行

算法所需的时间数量级与空间数量级。

8、问题的 最优子结构性质 是该问题可用动态规划算法或贪心算法求解的关键特

征。

9、以深度优先方式系统搜索问题解的算法称为 回溯法 。

10、冒泡法排序的时间复杂度为 2n 。

11、计算一个算法时间复杂度通常可以计算 循环次数 、 基本 或计算步。

12、Huffman 树又称为最优二叉树,是一类带权路径长度最 短 的二叉树。

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

是 动态规划 ,需要排序的是 回溯法 ,分支限界法 。

15、使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的

界,N 皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标

函数的界进行裁剪的是 0/1背包问题 ,只使用约束条件进行裁剪的是 N 皇

后问题 。

16、 贪心选择性质 是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法

的主要区别。

17、矩阵连乘问题的算法可由 动态规划 设计实现。

18、组合数的计算公式为),0()!

(!!),(n m n n m n m n m c ≠≠-=,设计一个算法复杂度低的一重循环实施乘即可求解该组合数计算。for(c=1,k=1;k<=n;k++) c= C*(m-k+1)/k 。

19.贪心算法的基本要素是 贪心选择质和最优子结构 性质。

20.当一个问题的最优解中包含了子问题的最优解时,则称该问题具有 最优子结构特性 特性。

21. 一场球赛开始前,售票工作正在紧张进行中。有m+n 个人排队等待购票,其中有m 个人

手持50元的钞票,另外n 个人手持100元的钞票。求出这m+n 个人排队购票,使售票处不

至出现找不开钱的局面的不同排队种数。则递推方程f (m ,n )== f(m,n-1)+f(m-1,n) 。

22. Hanoi 问题有n 个圆盘从A 桩全部移动到C 桩,假设共需移动m (n )次,则其递归关

系为 g(n)=2g(n-1)+1 。1. 2.

23,给定一个由n个整数组成的数列,对数列进行一次操作:去除其中两项a,b,然后添加一项a*b+1,经n-1次操作后最后得数获得最大值。则贪心算法的策略是对数列进行排序,每次删掉最小的两个。

24、杨辉三角组合公式中,c(n,0)=1,则c(n,k)= (n-k+1)/k*c(n,k-1)。

25、舍伍德算法总能求得问题的一个解。

26、贪心选择性质是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

27.一个程序应包括对数据的描述与对运算操作的描述两个方面内容。著名计算机科学家

(Nikiklaus Wirth)提出关于程序描述的一个公式,即:数据结构+ 算法=程序。

28.动态规划算法的两个基本要素是最优子结构性质和重叠子问题性质。

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

31. 若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X和Y的一个最长公共子序列______ {BABCD}或{CABCD}或{CADCD} _____________________。

32.二分搜索算法是利用____动态规划___________实现的算法。

33.在给定的n个数字的数字串中,删除其中k(k

34.任何可用计算机求解的问题所需的时间都与其规模有关。

35. 算法由操作、控制结构与数据结构三要素构成。

36.当一个问题的最优解中包含了子问题的最优解时,则称该问题具有最优子结构特性特性。

37.结构化程序设计的基本要点为:自定向下,逐步求精;模块化设计和结构化编程。

38.快速排序法的时间复杂度为 O(nlogn) 。

39.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含___一个(最优)解________。

40. 0-1背包问题的回溯算法所需的计算时间为______ O(n*2n) ___________________。

三、算法填空

1.背包问题的贪心算法

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

{

Sort(n,v,w);

int i;

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

float c=M;

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

if (w[i]>c) break;

x[i]=1;

c - =w[i];

}

if (i<=n) x[i]=c/w[i];

}

2. // 含数字m且不能被m整除的n位整数的个数统计与求和

#include

void main()

{ int c,j,m,n,f[10];

long d,k,g1,g2,s1,s2,t;

scanf("%d,%d",&m,&n);

t=1;

for(k=1;k<=n-1;k++)

t=t*10;

g1=0;s1=0;

g2=0;s2=0;

for(k=t;k<=10*t-1;k++)

{ d=k;

for(j=0;j<=9;j++) f[j]=0;

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

{ c=d%10;f[c]+=1; d=d/10; }

if(f[m]>0 && k%m>0)

{g1++;s1+=k;}

if(f[m]==2 && k%m>0 )

{g2++;s2+=k;}

}

}

3. 已知的n个西瓜的重量分别为整数,请把这堆西瓜分成两堆,每堆的个数不一定相等,

使两堆西瓜重量之差为最小。

#include

#define N 40

void main()

{int n,c1,i,j,s,t,cb,sb,b[N],m[N][10*N];

printf(" input n: "); scanf("%d",&n);

s=0;

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

{printf(" 请输入第%d个整数:",i);

scanf("%d",&b[i]); s+=b[i];

}

c1=s/2;

printf(" 各个西瓜重量:");

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

printf(" %d",b[i]);

printf("\n 总重量s=%d \n",s);

for(j=0;j

m[n][j]=0;

for(j=b[n];j<=c1;j++)

m[n][j]=b[n];

for(i=n-1;i>=1;i--)

for(j=0;j<=c1;j++)

if(j>=b[i] && m[i+1][j]

m[i][j]=m[i+1][j-b[i]]+b[i];

else

m[i][j]=m[i+1][j];

printf(" 两堆之差最小值为:%d \n",s-2*m[1][c1]);

printf(" 第1堆: ");

cb=m[1][c1];

for(sb=0,i=1;i<=n-1;i++)

if(m[i][cb]>m[i+1][cb]) {cb-=b[i];sb+=b[i]; printf(" %3d",b[i]); b[i]=0; }

if(m[1][c1]-sb==b[n])

{printf(" %3d",b[n]);

sb+=b[n]; b[n]=0;

}

printf(" (%d)\n",sb);

printf(" 第2堆: ");

for(sb=0,i=1;i<=n;i++)

if(b[i]>0)

{sb+=b[i];

printf(" %3d",b[i]);

}

printf(" (%d)\n",sb);

}

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

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 b=a[i]; ;

//一旦某个区段和为负,则从下一个位置累和

if(b>sum) sum=b;

}

return sum;

}

5. 自然对数的底数e是一个无限不循环小数, 是“自然律”的一种量的表达,在科学技术中

用得非常多。学习了高数后我们知道,以e为底数的对数是最简的,用它是最“自然”的,所以叫“自然对数”。试设计程序计算自然对数的底e,精确到小数点后指定的x位。

#include

#include

void main()

{ double s; int x,n,c,i,j,d,l,a[5000];

printf(" 请输入精确位数:");

scanf("%d",&x);

for(s=0,n=2;n<=5000;n++)

{s=s+log10(n);if (s>x) break }

for(i=0;i<=x+2;i++)

a[i]=0;

for(c=1,j=n;j>=2;j--)

{d=j;

for(i=0;i<=x+1;i++) {a[i]=c/d; c=(c%d)*10+a[i+1];}

a[x+2]=c/d;

a[0]=a[0]+1;c=a[0];

}

printf("\n e=%d.",a[0]+1);

for(l=10,i=1;i<=x;i++)

{ printf("%d",a[i]);

l++;

if (l%10==0) printf(" ");

if (l%50==0) printf("\n");

}

printf("\n");

}

6. 核反应堆中有α和β两种粒子,每秒钟内一个α粒子可以裂变为3个β粒子,而一个β

粒子可以裂变为1个α粒子和2个β粒子。若在t=0时刻的反应堆中只有一个α粒子,求在t秒时反应堆裂变产生的α粒子和β粒子数。

#include

void main()

{int t,k;long g[100];

printf(" input t:");

scanf("%d",&t);

g[0]=0; g[1]=3

for(k=2;k<=t;k++)

g[k]=2*g[k-1]+3*g[k-2];

printf("%d 秒时反应堆中β粒子数为:%ld \n",t,g[t]);

printf("%d 秒时反应堆中α粒子数为:%ld \n",t,g[t-1]);

7.贪心算法求装载问题

template

void Loading(int x[], Type w[], Type 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;

}

}

8. 设x ,y 为非负整数,试计算集合M={2^x*3^y ,x>=0,y>=0}的元素不大于制定整数n 的

个数,并求这些元素从小到大排序的第m 项,即幂序列2^x*3^y 枚举求解。

#include

void main()

{int k,m;

long a,j,n,f[1000];

scanf("%ld",&n);

scanf("%d",&m);

f[1]=1;f[2]=2;k=2;

for(a=3;a<=n;a++)

{ j=a; while(j%2==0) j=j/2; while(j%3==0) j=j/3;

if(j==1)

{ k++;f[k]=a; }

}

printf(" 幂序列中不大于%ld 的项数为:%d\n",n,k);

if(m<=k)

printf(" 从小到大排序的第%d 项为:%ld\n",m,f[m]);

else

printf(" 所输序号m 大于序列的项数!\n");

}

9. 已知b 数列定义:)2(23,2,12121>-===--n b b b b b n n n ,建立b 数列的递归函数,求b

数列的前n 项之和。

#include

long b(int n)

{ long g;

if(n==1) g=1; else if(n==2) g=2; else g=3*b(n-1)-2*b(n-2); return(g); } void main()

{ int k,n; long s=0;

printf(" 请输入n: ");scanf("%d",&n);

for(k=1;k<=n;k++) s+=b(k);

printf(" b(%d)=%ld \n",n,b(n));

printf(" s=%ld \n",s);

}

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

template

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

{ A[1]=true;

int j=1;

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

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

{ A[i]=true;

j=i;

}

else A[i]=false;

}

}

10. 定义一个世纪的100个年号中不存在一个素数,即100个年号全为合数的世纪称为合数

世纪。探索最早的合数世纪。

#include

#include

void main()

{long a,b,k; int s,x;

a=1;

while (1)

{a++;s=0;

for(b=a*100-99;b<=a*100-1;b+=2;)

{x=0;

for(k=3;k<=sqrt(b);k+=2) if(b%k==0) {x=1;break;}

if(x==0)break;

s=s+x;

}

if(s==50)

{ printf("最早出现的合数世纪为 %ld 世纪!\n",a);

break;

}

}

}

11.快速排序

template

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

{

if (p

int q=Partition(a,p,r); QuickSort (a,p,q-1); //对左半段排序 QuickSort (a,q+1,r); //对右半段排序

}

}

12. 阶乘n!定义: n!=1(n=1);n!=n*(n-1)! (n>1),设计求n!的递归函数,调用该函数求!

1!21!111n s ++++= 。 #include

long f(int n)

{ long g; if(n==1) g=1; else g=n*f(n-1); return(g);

}

void main()

{ int k,n;

double s=1;

printf(" 请输入n: ");scanf("%d",&n);

for(k=1;k<=n;k++) s+=(double)1/f(k);

printf(" s=%f \n",s);

}

13.排列问题

Template

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

{ //产生[list[k:m]的所有排列 if(k==m)

{ //只剩下一个元素

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

cout<

}

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

for (int i=k; i<=m; i++)

{

swap(list[k],list[i]); perm(list,k+1;m);

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

}

}

14. 模拟扑克升级发牌,把含有大小王的共54张牌随机分发给4家,每家12张,底牌保留6张。

// 发扑克升级牌,有大小王,4个人每人12张牌,底牌6张.

#include

#include

#include

void main()

{int x,y,z,t,i,j,k,e[14],s[14],w[14],n[14],m[53];

char d[]=" 234567891JQKA";

t=time(0)%1000;srand(t);

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

{for(j=1;j<=10000;j++)

{ x=rand()%4+1;y=rand()%13+2;z=x*100+y;t=0;for(k=0;k<=i-1;k++) if(z==m[k]) {t=1;break;}

if(t==0)

{m[i]=z;break;}

}

}

for(k=1;k<=13;k++) // 依次把52张扑克牌分发到四家

{e[k]=m[4*k-3]; s[k]=m[4*k-2];

w[k]=m[4*k-1]; n[k]=m[4*k];}

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

for(j=i+1;j<=13;j++)

{if(e[i]

if(s[i]

if(w[i]

if(n[i]

}

printf("\n");

for(i=4;i>=1;i--)

{for(j=1;j<=28;j++) printf(" ");

printf("%c:",i+2);

for(j=1;j<=13;j++)

{ if(n[j]/100==i) if(n[j]%100==10) printf("10 ");else printf(" %c ",d[n[j]%100]);}

printf("\n");

}

printf("\n");

for(j=1;j<=35;j++) printf(" "); printf("N \n\n");

for(i=4;i>=1;i--)

{printf(" %c:",i+2);

for(t=0,j=1;j<=13;j++)

{if(w[j]/100==i)

{t++;

if(w[j]%100==10) printf("10 ");

else printf(" %c ",d[w[j]%100]);

}

}

if(i!=3)

for(j=1;j<=50-3*t;j++) printf(" ");

else

{for(j=1;j<=25-3*t;j++) printf(" ");

printf("W E");

for(j=1;j<=10;j++) printf(" ");

}

printf("%c:",i+2);

}

16. 2x+3y按项的大小枚举设计,c262

#include

void main()

{ int n,t,k,i,h,j,a[30000];

printf("请输入n: ");

scanf("%d",&n);

a[1]=1;a[2]=2;

t=2;k=2;

while(t

{ k++;h=0; // 枚举k是否为A集项for(i=2;i<=t;i++)

{for(j=1;j<=i-1;j++)

if(k==2*a[j]+3*a[i] || k==2*a[i]+3*a[j])

{ h=1;

t++;a[t]=k; // 若k为A集项,给a[t]赋值 break;

}

if(h==1) break;

}

}

printf(" a(%d)=%d ",n,a[n]);

}

16.可拆背包问题,c741

#include

#define N 100

void main()

{float p[N],w[N],x[N],c,cw,s,h;

int i,j,n;

printf("\n input n:"); scanf("%d",&n); // 输入已知条件 printf("input c:"); scanf("%f",&c);

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

{printf("input w%d,p%d:",i,i);

scanf("%f,%f",&w[i],&p[i]);

}

for(i=1;i<=n?1;i++) // 对n件物品按单位重量的效益从大到小排序

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

if(p[i]/w[i]

{ h=p[i];p[i]=p[j]; p[j]=h;

h=w[i];w[i]=w[j]; w[j]=h;

}

cw=c;s=0; // cw为背包还可装的重量

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

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

x[i]=1.0; // 若w(i)<=cw,整体装入

cw=cw?w[i];

s=s+p[i];

}

x[i]=(float)(cw/w[i]); // 若w(i)>cw,装入一部分x(i)

s=s+p[i]*x[i];

printf("装包:"); // 输出装包结果

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

if(x[i]<1) break;

else

printf("\n 装入重量为%5.1f效益为%5.1f的物品.",w[i],p[i]);

if(x[i]>0 && x[i]<1)

printf("\n 装入重量为%5.1f效益为%5.1f的物品百分之%5.1f.",w[i], p[i],x[i]*100); printf("\n 所得最大效益为:%7.1f ",s);

}

17.模拟乘竖式计算求解尾数前移问题,c832

#include

void main()

{ int a,m,j,k,p,q,w[100];

printf("请输入尾数字q,倍数p:");

scanf("%d,%d",&q,&p);

for(j=1;j<100;j++) w[j]=0; // 数组清零

w[1]=q;m=0;k=1;a=p*q; // 输入初始量

while(a!=q)

{ a=w[k]*p+m;

k++; w[k]=a%10;m=a/10; // 模拟整数乘竖式计算,m为进位数

}

printf("n(%d,%d)=",q,p);

for(j=k-1;j>=1;j--) // 从高位到低位打印每一位

printf("%d",w[j]);

printf("\n 共%d 位。\n",k-1);

}

四、算法或编写程序题

算法题

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. 分数分解算法描述

把真分数a/b 分解为若干个分母为整数分子为“1”的埃及分数之和:

(1) 寻找并输出小于a/b 的最大埃及分数1/c ;

(2) 若c>900000000,则退出;

(3) 若c ≤900000000,把差a/b-1/c 整理为分数a/b ,若a/b 为埃及分数,则输出后结束。

(4) 若a/b 不为埃及分数,则继续(1)、(2)、(3)。

试描述以上算法。 解:设)(int a b d = (这里int(x)表示取正数x 的整数),注意到1+<

b d ,有 )1()1(11+-+++=d b b

d a d b a

算法描述:令c=d+1,则

input (a,b)

while(1)

{c=int(b/a)+1;

if(c>900000000) return;

else

{ print(1/c+);

a=a*c-b;

b=b*c; // a,b 迭代,为选择下一个分母作准备

if(a==1)

{ print(1/b);return;}

}

}

3. n 位高逐位整除程序。(第1位被1整除,第2位被2整除…第n 位被n 整除,如102455

位逐位整除数。

#include

void main()

{ int i,j,n,r,t,s,a[100];

printf(" 高逐位整除n位,请确定n:");

scanf("%d",&n);

printf(" 所求%d位高逐位整除数:\n",n);

for(j=1;j<=100;j++) a[j]=0;

t=0;s=0;

i=1;a[1]=1;

while(a[1]<=9)

{ if(t==0 && i

for(r=0,j=1;j<=i;j++) // 检测i时是否整除i

{ r=r*10+a[j]; r=r%i; }

if(r!=0)

{ a[i]=a[i]+1;t=1; // 余数r!=0时,a[i]增1,t=1

while(a[i]>9 && i>1)

{ a[i]=0;

i--; // 回溯

a[i]=a[i]+1;

}

}

else t=0; // 余数r=0时,t=0

if(t==0 && i==n)

{ s++;printf(" %d: ",s);

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

printf("%d",a[j]);

printf("\n");

a[i]=a[i]+1;

}

}

if(s==0) printf( " 没有找到!\n");

else printf(" 共以上%d个解。\n",s);

}

4.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.最大团问题

void Clique::Backtrack(int i) //

计算最大团

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

for (int j = 1; j <= n; j++) bestx[j] = x[j];

bestn = cn; return;} // 检查顶点 i 与当前团的连接

int OK = 1;

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

if (x[j] && a[i][j] == 0) { // i与j不相连

OK = 0; break;}

if (

OK ) { // 进入左子树

x[i] = 1; cn++;

Backtrack(i+1);

x[i] = 0; cn--; }

if ( cn + n - i > bestn ) { // 进入右子树

x[i] = 0;

Backtrack(i+1); }

}

5.指定低逐位整除数探求

试求出所有最高位为3的24位低逐位整除数(除个位数字为“0”外,其余各位数字均不得为“0”)。

// 最高位为3的n位右逐位整除

#include

void main()

{ int i,j,n,r,t,a[100]; long s=0;

printf(" 逐位整除n位,请确定n:");

scanf("%d",&n);

printf(" 所求%d位最高位为3的右逐位整除数:\n",n);

for(j=1;j<=100;j++) a[j]=1;

t=0;a[1]=0;i=1;

while(a[1]<1)

{ if(t==0 && i

for(r=0,j=i;j>=1;j--) // 检测i时是否整除i

{ r=r*10+a[j]; r=r%i; }

if(r!=0)

{ a[i]=a[i]+1;t=1; // 余数r!=0时a[i]增1,t=1

while(a[i]>9 && i>1)

{ a[i]=1;i--; // 回溯

a[i]=a[i]+1;

}

}

else t=0; // 余数r=0时,t=0 if(t==0 && i==n)

{ if(a[n]==3)

{s++;printf(" %ld: ",s);

for(j=n;j>=1;j--)

printf("%d",a[j]);

printf("\n");

}

a[i]=a[i]+1;

}

}

if(s>0)

printf(" 最高位为3的%d位右逐位整除数共%ld个.",n,s); else

printf(" 未找到n位右逐位整除数.",n);

}

6. 求[x,y]范围内整数的因数比最大值

#include

#include

void main()

{ double a,s,a1,s1,b,k,t,x,y,max=0;

printf(" 求区间[x,y]中整数的因数比最大值.");

printf(" 请输入整数x,y:");

scanf("%lf,%lf",&x,&y);

for(a=x;a<=y;a++) // 枚举区间内的所有整数a

{s=1;b=sqrt(a);

for(k=2;k<=b;k++) // 试商寻求a的因数k

if(fmod(a,k)==0)

s=s+k+a/k; // k与a/k是a的因数,求和

if(a==b*b)

s=s-b; // 如果a=b^2,去掉重复因数b t=s/a;

if(max

{max=t;a1=a;s1=s;}

}

printf(" 整数%.0f的因数比最大:%.4f \n",a1,max);

printf(" %.0f的因数和为:\n",a1);

printf(" %.0f=1",s1); // 输出其因数和式 for(k=2;k<=a1/2;k++)

if(fmod(a1,k)==0)

printf("+%.0f",k);

}

7. 分解质因数

对给定区间[m,n]的正整数分解质因数,?每一整数表示为质因数从小到大顺序的乘积形式。如果被分解的数本身是素数,则注明为素数。

例如, 2012=2*2*503, 2011=(素数!)。

解:对区间中的每一个整数i(b=i),用k(2——sqrt(i))试商:

若不能整除,说明该数k不是b的因数,k增1后继续试商。

若能整除,说明该数k是b的因数,打印输出"k*";b除以k的商赋给b(b=b/k)?后继续用k试商(注意,可能有多个k因数),直至不能整除,k增1后继续试商。

按上述从小至大试商确定的因数显然为质因数。

如果有大于sqrt(n)的因数(至多一个!)?,在试商循环结束后要注意补上,不要遗失。

如果整个试商后b的值没有任何缩减,仍为原待分解数n,说明n是素数,作素数说明标记。

若k是b的因数,按格式输出,然后b=b/k后继续试商k。

若k不是b的因数,则k增1后继续。

若上述试商完成后1

若试商后b还是原来的i,则i是素数。

// 质因数分解乘积形式

#include"math.h"

#include

void main()

{long int b,i,k,m,n,w=0;

printf("[m,n]中整数分解质因数(乘积形式).\n");

printf("请输入m,n:");

scanf("%ld,%ld",&m,&n);

for(i=m;i<=n;i++) // i为待分解的整数

{ printf("%ld=",i);

b=i;k=2;

while(k<=sqrt(i)) // k为试商因数

{if(b%k==0)

{b=b/k;

if(b>1)

{printf("%ld*",k);

continue; // k为质因数,返回再试

}

if(b==1) printf("%ld\n",k);

}

k++;

}

if(b>1 && b

printf("%ld\n",b); // 输出大于i平方根的因数

if(b==i)

算法设计与分析考试题及答案

算法设计与分析考试题 及答案 Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】

一、填空题(20分) 1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:确定性 有穷性 可行性 0个或多个输入 一个或多个输出 2.算法的复杂性有时间复杂性 空间复杂性之分,衡量一个算法好坏的标准是 时间复杂度高低 3.某一问题可用动态规划算法求解的显着特征是 该问题具有最优子结构性质 4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X 和Y 的一个最长公共子序列{BABCD}或{CABCD}或{CADCD } 5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含一个(最优)解 6.动态规划算法的基本思想是将待求解问题分解成若干_子问题 ,先求解_子问题 ,然后从这些子问题 的解得到原问题的解。 7.以深度优先方式系统搜索问题解的算法称为回溯法 背包问题的回溯算法所需的计算时间为o(n*2n ) ,用动态规划算法所需的计算时间为o(min{nc,2n }) 9.动态规划算法的两个基本要素是最优子结构 _和重叠子问题 10.二分搜索算法是利用动态规划法实现的算法。 二、综合题(50分) 1.写出设计动态规划算法的主要步骤。 ①问题具有最优子结构性质;②构造最优值的递归关系表达式; ③最优值的算法描述;④构造最优解; 2. 流水作业调度问题的johnson 算法的思想。 ①令N 1={i|a i =b i };②将N 1中作业按a i 的非减序排序得到N 1’,将N 2中作业按b i 的非增序排序得到N 2’;③N 1’中作业接N 2’中作业就构成了满足Johnson 法则的最优调度。 3. 若n=4,在机器M1和M2上加工作业i 所需的时间分别为a i 和b i ,且 (a 1,a 2,a 3,a 4)=(4,5,12,10),(b 1,b 2,b 3,b 4)=(8,2,15,9)求4个作业的最优调度方案,并计算最优值。 步骤为:N1={1,3},N2={2,4}; N 1’={1,3}, N 2’={4,2}; 最优值为:38 4. 使用回溯法解0/1背包问题:n=3,C=9,V={6,10,3},W={3,4,4},其解空间有长度为3的0-1向量组成,要求用一棵完全二叉树表示其解空间(从根出发,左1右0),并画出其解空间树,计算其最优值及最优解。 解空间为{(0,0,0),(0,1,0),(0,0,1),(1,0,0),(0,1,1),(1,0,1), (1,1,0),(1,1,1)}。 解空间树为: 该问题的最优值为:16 最优解为:(1,1,0) 5. 设S={X 1,X 2,···,X n }是严格递增的有序集,利用二叉树的结点来存储S 中的元素,在表示S 的二叉搜索树中搜索一个元素X ,返回的结果有两种情形,(1)在二叉搜索树的内结点中找到X=X i ,其概率为b i 。(2)在二叉搜索树的叶结点中确定X ∈(X i ,X i+1),其概率为a i 。在表示S 的二叉搜索树T 中,设存储元素X i 的结点深度为C i ;叶结点(X i ,X i+1)的结点深度为d i ,则二叉搜索树T 的平均路长p 为多少假设二叉搜索树T[i][j]={X i ,X i+1,···,X j }最优值为m[i][j],W[i][j]= a i-1+b i +···+b j +a j ,则m[i][j](1<=i<=j<=n)递归关系表达式为什么 .二叉树T 的平均路长P=∑=+n i 1 Ci)(1*bi +∑=n j 0 dj *aj

《计算机算法设计与分析》习题及答案

《计算机算法设计与分析》习题及答案 一.选择题 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是(A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4. 回溯法解旅行售货员问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 5.下列算法中通常以自底向上的方式求解最优解的是(B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 6、衡量一个算法好坏的标准是( C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 7、以下不可以使用分治法求解的是( D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 8. 实现循环赛日程表利用的算法是(A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 9.下面不是分支界限法搜索方式的是(D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先 10.下列算法中通常以深度优先方式系统搜索问题解的是(D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法

11.备忘录方法是那种算法的变形。( B ) A、分治法 B、动态规划法 C、贪心法 D、回溯法 12.哈夫曼编码的贪心算法所需的计算时间为(B )。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 13.分支限界法解最大团问题时,活结点表的组织形式是(B )。 A、最小堆 B、最大堆 C、栈 D、数组 14.最长公共子序列算法利用的算法是(B)。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 15.实现棋盘覆盖算法利用的算法是(A )。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 16.下面是贪心算法的基本要素的是(C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解 17.回溯法的效率不依赖于下列哪些因素( D ) A.满足显约束的值的个数 B. 计算约束函数的时间 C.计算限界函数的时间 D. 确定解空间的时间 18.下面哪种函数是回溯法中为避免无效搜索采取的策略(B ) A.递归函数 B.剪枝函数 C。随机数函数 D.搜索函数 19. (D)是贪心算法与动态规划算法的共同点。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、最优子结构性质 20. 矩阵连乘问题的算法可由( B )设计实现。 A、分支界限算法 B、动态规划算法 C、贪心算法 D、回溯算法 21. 分支限界法解旅行售货员问题时,活结点表的组织形式是( A )。

算法设计与分析考试题及答案

1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:_________,________,________,__________,__________。 2.算法的复杂性有_____________和___________之分,衡量一个算法 好坏的标准是______________________。 3.某一问题可用动态规划算法求解的显著特征是 ____________________________________。 4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X 和Y的一个最长公共子序列_____________________________。 5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含___________。 6.动态规划算法的基本思想是将待求解问题分解成若干____________,先求解___________,然后从这些____________的解得到原问题的解。 7.以深度优先方式系统搜索问题解的算法称为_____________。 8.0-1背包问题的回溯算法所需的计算时间为_____________,用动态规划算法所需的计算时间为____________。 9.动态规划算法的两个基本要素是___________和___________。 10.二分搜索算法是利用_______________实现的算法。 二、综合题(50分) 1.写出设计动态规划算法的主要步骤。 2.流水作业调度问题的johnson算法的思想。

算法设计与分析课后部分习题答案

算法实现题3-7 数字三角形问题 问题描述: 给定一个由n行数字组成的数字三角形,如图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。编程任务: 对于给定的由n行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数字和的最大值。数据输入: 有文件input.txt提供输入数据。文件的第1行是数字三角形的行数n,1<=n<=100。接下来的n行是数字三角形各行的数字。所有数字在0-99之间。结果输出: 程序运行结束时,将计算结果输出到文件output.txt中。文件第1行中的数是计算出的最大值。 输入文件示例输出文件示 例 input.txt output.txt 5 30 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 源程序: #include "stdio.h" voidmain() { intn,triangle[100][100],i,j;//triangle数组用来存储金字塔数值,n表示行数 FILE *in,*out;//定义in,out两个文件指针变量 in=fopen("input.txt","r"); fscanf(in,"%d",&n);//将行数n读入到变量n中

for(i=0;i=0;row--)//从上往下递归计算 for(int col=0;col<=row;col++) if(triangle[row+1][col]>triangle[row+1][col+1]) triangle[row][col]+=triangle[row+1][col]; else triangle[row][col]+=triangle[row+1][col+1]; out=fopen("output.txt","w"); fprintf(out,"%d",triangle[0][0]);//将最终结果输出到output.txt中 } 算法实现题4-9 汽车加油问题 问题描述: 一辆汽车加满油后可行驶nkm。旅途中有若干加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。并证明算法能产出一个最优解。编程任务: 对于给定的n和k个加油站位置,编程计算最少加油次数。数据输入: 由文件input.txt给出输入数据。第1行有2个正整数n和k ,表示汽车加满油后可行驶nkm,且旅途中有k个加油站。接下来的1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第

算法设计与分析试卷

算法设计与分析试卷(A 卷) 一、 选择题 ( 选择1-4个正确的答案,每题2分,共20分) (1)计算机算法的正确描述是: A .一个算法是求特定问题的运算序列. B .算法是一个有穷规则的集合,其中之规则规定了一个解决某一特定类型的问题的运算序列. C .算法是一个对任一有效输入能够停机的图灵机. D .一个算法,它是满足5 个特性的程序,这5个特性是:有限性、确定性、能 行性、有0个或多个输入且有1个或多个输出. (2)影响程序执行时间的因素有哪些? A .算法设计的策略 B .问题的规模 C .编译程序产生的机器代码质量 D .计算机执行指令的速度 (3)用数量级形式表示的算法执行时间称为算法的 A .时间复杂度 B .空间复杂度 C .处理器复杂度 D .通信复杂度 (4)时间复杂性为多项式界的算法有: A .快速排序算法 B .n-后问题 C .计算π值 D .prim 算法 (5)对于并行算法与串行算法的关系,正确的理解是: A .高效的串行算法不一定是能导出高效的并行算法 B .高效的串行算法不一定隐含并行性 C .串行算法经适当的改造有些可以变化成并行算法 D. 用串行方法设计和实现的并行算法未必有效 (6)衡量近似算法性能的重要标准有: A .算法复杂度 B .问题复杂度 C .解的最优近似度 D .算法的策略 (7)分治法的适用条件是,所解决的问题一般具有这些特征: A .该问题的规模缩小到一定的程度就可以容易地解决; B .该问题可以分解为若干个规模较小的相同问题; C .利用该问题分解出的子问题的解可以合并为该问题的解 D .该问题所分解出的各个子问题是相互独立的. (8)具有最优子结构的算法有: A .概率算法 B .回溯法 C .分支限界法 D .动态规划法 (9)下列哪些问题是典型的NP 完全问题: A .排序问题 B .n-后问题 C .m-着色问题 D .旅行商问题 (10)适于递归实现的算法有: A .并行算法 B .近似算法 C .分治法 D .回溯法 二、算法分析题(每小题5分,共10分) (11)用展开法求解递推关系: (12)分析当输入数据已经有序时快速排序算法的不足,提出算法的改进方案. ???>+-==1 1)1(211)(n n T n n T

算法设计与分析实验报告

算法设计与分析课程实验项目目录 学生姓名:学号: *实验项目类型:演示性、验证性、综合性、设计性实验。 *此表由学生按顺序填写。 本科实验报告专用纸

课程名称算法设计与分析成绩评定 实验项目名称蛮力法指导教师 实验项目编号 201 实验项目类型设计实验地点机房 学生姓名学号 学院信息科学技术学院数学系信息与计算科学专业级 实验时间 2012年 3月 1 日~6月30日温度24℃ 1.实验目的和要求: 熟悉蛮力法的设计思想。 2.实验原理和主要内容: 实验原理:蛮力法常直接基于问题的描述和所涉及的概念解决问题。 实验内容:以下题目任选其一 1).为蛮力字符串匹配写一段可视化程序。 2).写一个程序,实现凸包问题的蛮力算法。 3).最著名的算式谜题是由大名鼎鼎的英国谜人给出的: S END +MORE MONEY . 这 里有两个前提假设:第一,字母和十进制数字之间一一对应,也就是每个字母只代表一个数字,而且不同的字母代表不同的数字;第二,数字0不出现在任何数的最左边。求解一个字母算术意味着找到每个字母代表的是哪个数字。请注意,解可能并不是唯一的,不同人的解可能并不相同。 3.实验结果及分析: (将程序和实验结果粘贴,程序能够注释清楚更好。) 本科实验报告专用纸(附页) 该算法程序代码如下:

#include "" #include "" int main(int argc, char* argv[]) { int x[100],y[100]; int a,b,c,i,j,k,l,m,n=0,p,t1[100],num; int xsat[100],ysat[100]; printf("请输入点的个数:\n"); scanf("%d",&num); getchar(); clock_t start,end; start=clock(); printf("请输入各点坐标:\n"); for(l=0;l

算法设计与分析试卷(2010)

内部资料,转载请注明出处,谢谢合作。 算法设计与分析试卷(A 卷) 一、 选择题 ( 选择1-4个正确的答案, 每题2分,共20分) (1)计算机算法的正确描述是: A .一个算法是求特定问题的运算序列。 B .算法是一个有穷规则的集合,其中之规则规定了一个解决某一特定类型的问题的运算序列。 C .算法是一个对任一有效输入能够停机的图灵机。 D .一个算法,它是满足5 个特性的程序,这5个特性是:有限性、确定性、能 行性、有0个或多个输入且有1个或多个输出。 (2)影响程序执行时间的因素有哪些? A .算法设计的策略 B .问题的规模 C .编译程序产生的机器代码质量 D .计算机执行指令的速度 (3)用数量级形式表示的算法执行时间称为算法的 A .时间复杂度 B .空间复杂度 C .处理器复杂度 D .通信复杂度 (4)时间复杂性为多项式界的算法有: A .快速排序算法 B .n-后问题 C .计算π值 D .prim 算法 (5)对于并行算法与串行算法的关系,正确的理解是: A .高效的串行算法不一定是能导出高效的并行算法 B .高效的串行算法不一定隐含并行性 C .串行算法经适当的改造有些可以变化成并行算法 D. 用串行方法设计和实现的并行算法未必有效 (6)衡量近似算法性能的重要标准有: A .算法复杂度 B .问题复杂度 C .解的最优近似度 D .算法的策略 (7)分治法的适用条件是,所解决的问题一般具有这些特征: A .该问题的规模缩小到一定的程度就可以容易地解决; B .该问题可以分解为若干个规模较小的相同问题; C .利用该问题分解出的子问题的解可以合并为该问题的解 D .该问题所分解出的各个子问题是相互独立的。 (8)具有最优子结构的算法有: A .概率算法 B .回溯法 C .分支限界法 D .动态规划法 (9)下列哪些问题是典型的NP 完全问题: A .排序问题 B .n-后问题 C .m-着色问题 D .旅行商问题 (10)适于递归实现的算法有: A .并行算法 B .近似算法 C .分治法 D .回溯法 二、算法分析题(每小题5分,共10分) (11)用展开法求解递推关系: (12)分析当输入数据已经有序时快速排序算法的不足,提出算法的改进方案。 ???>+-==1 1)1(211)(n n T n n T

算法设计与分析第2版 王红梅 胡明 习题答案

精品文档习题胡明-版)-王红梅-算法设计与分析(第2答案 1 习题)—1783Leonhard Euler,17071.图论诞生于七桥问题。出生于瑞士的伟大数学家欧拉(提 出并解决了该问题。七桥问题是这样描述的:北区一个人是否能在一次步行中穿越哥尼斯堡(现东区在叫加里宁格勒,在波罗的海南岸)城中全部岛区的七座桥后回到起点,且每座桥只经过一次,南区是这条河以及河上的两个岛和七座桥的图1.7 1.7 七桥问题图草图。请将该问题的数据模型抽象出来,并判断此问题是否有解。 七桥问题属于一笔画问题。 输入:一个起点 输出:相同的点一次步行1,经过七座桥,且每次只经历过一次2,回到起点3,该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。另一类是只有二个奇点的图形。)用的不是除法而是减最初的欧几里德算法2.在欧几里德提出的欧几里德算法中(即法。请用伪代码描述这个版本的欧几里德算法 1.r=m-n r=0 循环直到2.m=n 2.1 n=r 2.2 r=m-n 2.3 m 输出3 .设计算法求数组中相差最小的两个元素(称为最接近数)的差。要求分别给出伪代3++描述。C码和 采用分治法// //对数组先进行快速排序在依次比较相邻的差//精品文档. 精品文档 #include using namespace std; int partions(int b[],int low,int high) { int prvotkey=b[low]; b[0]=b[low]; while (low=prvotkey)

算法设计与分析试卷及答案

湖南科技学院二○年学期期末考试 信息与计算科学专业年级《算法设计与分析》试题 考试类型:开卷试卷类型:C卷考试时量:120分钟 题号一二三四五总分统分人 得分 阅卷人 复查人 一、填空题(每小题3 分,共计30 分) 1、用O、Ω与θ表示函数f与g之间得关系______________________________。 2、算法得时间复杂性为,则算法得时间复杂性得阶为__________________________。 3、快速排序算法得性能取决于______________________________。 4、算法就是_______________________________________________________。 5、在对问题得解空间树进行搜索得方法中,一个活结点最多有一次机会成为活结点得就是_________________________。 6、在算法得三种情况下得复杂性中,可操作性最好且最有实际价值得就是_____情况下得时间复杂性。 7、大Ω符号用来描述增长率得下限,这个下限得阶越___________,结果就越有价值。。 8、____________________________就是问题能用动态规划算法求解得前提。 9、贪心选择性质就是指____________________________________________________________________________________________________________________。 10、回溯法在问题得解空间树中,按______________策略,从根结点出发搜索解空间树。 二、简答题(每小题10分,共计30分) 1、试述回溯法得基本思想及用回溯法解题得步骤。 2、有8个作业{1,2,…,8}要在由2台机器M1与M2组成得流水线上完成加工。每个作业加工得顺序都就是先在M1上加工,然后在M2上加工。M1与M2加工作业i所需得时间分别为: M110 2 8 12 6 9414

计算机算法设计与分析习题及答案

计算机算法设计与分析习 题及答案 Prepared on 24 November 2020

《计算机算法设计与分析》习题及答案 一.选择题 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是(A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4. 回溯法解旅行售货员问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 5.下列算法中通常以自底向上的方式求解最优解的是(B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 6、衡量一个算法好坏的标准是( C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 7、以下不可以使用分治法求解的是( D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 8. 实现循环赛日程表利用的算法是(A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 9.下面不是分支界限法搜索方式的是(D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先

10.下列算法中通常以深度优先方式系统搜索问题解的是(D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 11.备忘录方法是那种算法的变形。( B ) A、分治法 B、动态规划法 C、贪心法 D、回溯法 12.哈夫曼编码的贪心算法所需的计算时间为(B )。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 13.分支限界法解最大团问题时,活结点表的组织形式是(B )。 A、最小堆 B、最大堆 C、栈 D、数组 14.最长公共子序列算法利用的算法是(B)。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 15.实现棋盘覆盖算法利用的算法是(A )。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 16.下面是贪心算法的基本要素的是(C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解 17.回溯法的效率不依赖于下列哪些因素( D ) A.满足显约束的值的个数 B. 计算约束函数的时间 C.计算限界函数的时间 D. 确定解空间的时间 18.下面哪种函数是回溯法中为避免无效搜索采取的策略(B ) A.递归函数 B.剪枝函数 C。随机数函数 D.搜索函数 19. (D)是贪心算法与动态规划算法的共同点。

计算机算法设计与分析期末考试复习题

1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4、最长公共子序列算法利用的算法是( B )。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 5. 回溯法解TSP问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树6.下列算法中通常以自底向上的方式求解最优解的是( B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 7、衡量一个算法好坏的标准是(C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 8、以下不可以使用分治法求解的是(D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 9. 实现循环赛日程表利用的算法是( A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 10、实现最长公共子序列利用的算法是( B )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法11.下面不是分支界限法搜索方式的是( D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先 12.下列算法中通常以深度优先方式系统搜索问题解的是( D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 13. 一个问题可用动态规划算法或贪心算法求解的关键特征是问题的( B )。 A、重叠子问题 B、最优子结构性质 C、贪心选择性质 D、定义最优解14.广度优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 15.背包问题的贪心算法所需的计算时间为( B )。

算法设计与分析课程期末试卷-A卷(自测 )

华南农业大学期末考试试卷(A卷) 2008学年第一学期考试科目:算法分析与设计 考试类型:(闭卷)考试时间:120分钟 学号姓名年级专业 一、选择题(20分,每题2分) 1.下述表达不正确的是。 A.n2/2 + 2n的渐进表达式上界函数是O(2n) B.n2/2 + 2n的渐进表达式下界函数是Ω(2n) C.logn3的渐进表达式上界函数是O(logn) D.logn3的渐进表达式下界函数是Ω(n3) 2.当输入规模为n时,算法增长率最大的是。 A.5n B.20log2n C.2n2D.3nlog3n 3.T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是。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 4.在棋盘覆盖问题中,对于2k×2k的特殊棋盘(有一个特殊方块),所需的L型骨 牌的个数是。 A.(4k– 1)/3 B.2k /3 C.4k D.2k 5.在寻找n个元素中第k小元素问题中,若使用快速排序算法思想,运用分治算法 对n个元素进行划分,应如何选择划分基准?下面答案解释最合理。A.随机选择一个元素作为划分基准 B.取子序列的第一个元素作为划分基准 C.用中位数的中位数方法寻找划分基准 D.以上皆可行。但不同方法,算法复杂度上界可能不同

6. 现在要盖一所邮局为这9个村庄服务,请问邮局应该盖在 才能使到邮局到这9个村庄的总距离和最短。 A .(4.5,0) B .(4.5,4.5) C .(5,5) D .(5,0) 7. n 个人拎着水桶在一个水龙头前面排队打水,水桶有大有小,水桶必须打满水, 水流恒定。如下 说法不正确? A .让水桶大的人先打水,可以使得每个人排队时间之和最小 B .让水桶小的人先打水,可以使得每个人排队时间之和最小 C .让水桶小的人先打水,在某个确定的时间t 内,可以让尽可能多的人打上水 D .若要在尽可能短的时间内,n 个人都打完水,按照什么顺序其实都一样 8. 分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分 别解决子问题,最后将子问题的解组合起来形成原问题的解。这要求原问题和子问题 。 A .问题规模相同,问题性质相同 B .问题规模相同,问题性质不同 C .问题规模不同,问题性质相同 D .问题规模不同,问题性质不同 9. 对布线问题,以下 是不正确描述。 A .布线问题的解空间是一个图 B .可以对方格阵列四周设置围墙,即增设标记的附加方格的预处理,使得算法简化对边界的判定 C .采用广度优先的标号法找到从起点到终点的布线方案(这个方案如果存在的话)不一定是最短的 D .采用先入先出的队列作为活结点表,以终点b 为扩展结点或活结点队列为空作为算法结束条件 10. 对于含有n 个元素的子集树问题,最坏情况下其解空间的叶结点数目为 。 A .n! B .2n C .2n+1-1 D . ∑=n i i n 1 !/! 答案:DACAD CACCB

《算法设计与分析》考试题目及答案

《算法分析与设计》期末复习题 一、选择题 1.应用Johnson法则的流水作业调度采用的算法是(D) A. 贪心算法 B. 分支限界法 C.分治法 D. 动态规划算法 塔问题如下图所示。现要求将塔座A上的的所有圆盘移到塔座B上,并仍按同样顺序叠置。移动圆盘时遵守Hanoi塔问题的移动规则。由此设计出解Hanoi塔问题的递归算法正确的为:(B) " ; | 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); } }

3. 动态规划算法的基本要素为(C ) A. 最优子结构性质与贪心选择性质 B .重叠子问题性质与贪心选择性质 C .最优子结构性质与重叠子问题性质 D. 预排序与递归调用 4. 算法分析中,记号O 表示(B ), 记号Ω表示(A ), 记号Θ表示(D )。 … A.渐进下界 B.渐进上界 C.非紧上界 D.紧渐进界 E.非紧下界 5. 以下关于渐进记号的性质是正确的有:(A ) 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))=?= 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); }

算法设计与分析试卷及答案

湖南科技学院二○ 年 学期期末考试 信息与计算科学专业 年级《算法设计与分析》 试题 考试类型:开卷 试卷类型:C 卷 考试时量:120 分钟 1. 用O 、Ω和θ表示函数f 与g 之间的关系______________________________。 ()()log log f n n n g n n == 2. 算法的时间复杂性为1, 1()8(3/7), 2 n f n f n n n =?=? +≥?,则算法的时间复杂性的阶 为__________________________。 3. 快速排序算法的性能取决于______________________________。 4. 算法是_______________________________________________________。 5. 在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是_________________________。 6. 在算法的三种情况下的复杂性中,可操作性最好且最有实际价值的是_____情况下的时间复杂性。 7. 大Ω符号用来描述增长率的下限,这个下限的阶越___________,结果就越有价值。。 8. ____________________________是问题能用动态规划算法求解的前提。 9. 贪心选择性质是指________________________________________________________ ____________________________________________________________。 题 号 一 二 三 四 五 总分 统分人 得 分 阅卷人

《算法设计与分析》复习题(汇编)

填空 1.直接或间接地调用自身的算法称为 递归 。 2.算法的复杂性是 算法效率 的度量,是评价算法优劣的重要依据。 3.以广度优先或以最小耗费方式搜索问题解的算法称为 分支限界法 。 4.回溯法解题的显著特点是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为 o(h(n)) 。 5.人们通常将问题的解决方案分为两大类:一类是可以通过执行若干个步骤就能得出问题 6.算法就是一组有穷的 规则 ,它们规定了解决某一特定类型问题的 一系列运算 。 7.在进行问题的计算复杂性分析之前,首先必须建立求解问题所用的计算模型。3个基本计算模型是 随机存取机、 随机存取存储程序机 、 图灵机 。 8.快速排序算法的性能取决于 划分的对称性 。 9.计算机的资源最重要的是 内存 和 运算 资源。因而,算法的复杂性有时间 和 空间 之分。 10.贪心算法总是做出在当前看来 最优 的选择。也就是说贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的 局部最优解 。 11.许多可以用贪心算法求解的问题一般具有2个重要的性质: 最优子结构的 性质和 贪心选择的 性质。 12.常见的两种分支限界法为 队列式 和 优先队列式 。 13.解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中需要排序的是 回溯法 ,不需要排序的是 动态规划和分支限界法 。 14.f ( n ) = 6 × 2n + n 2,f(n)的渐进性态f ( n ) = O ( 2^n )。 15.对于含有n 个元素的排列树问题,最好情况下计算时间复杂性为 ,最坏情况下计算时间复杂性为 n! 。 16.在忽略常数因子的情况下,O 、Ω和Θ三个符号中, Θ 提供了算法运行时间的一个上界。 17.回溯法的求解过程,即在问题的解空间树中,按 深度优先 策略从根结点出发搜索解空间树。 18.分支限界法的求解过程,即在问题的解空间树中,按 广度优先 策略从根结点出发搜索解空间树。 19.多项式10()m m A n a n a n a =+ ++的上界为 2^n 。 20.用分支限界法解布线问题时,对空间树搜索结束的标志是 活结点表为空 。 21.使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的界,N 皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标函数的界进

算法设计与分析习题解答

第一章作业 1.证明下列Ο、Ω和Θ的性质 1)f=Ο(g)当且仅当g=Ω(f) 证明:充分性。若f=Ο(g),则必然存在常数c1>0和n0,使得?n≥n0,有f≤c1*g(n)。由于c1≠0,故g(n) ≥ 1/ c1 *f(n),故g=Ω(f)。 必要性。同理,若g=Ω(f),则必然存在c2>0和n0,使得?n≥n0,有g(n) ≥ c2 *f(n).由于c2≠0,故f(n) ≤ 1/ c2*f(n),故f=Ο(g)。 2)若f=Θ(g)则g=Θ(f) 证明:若f=Θ(g),则必然存在常数c1>0,c2>0和n0,使得?n≥n0,有c1*g(n) ≤f(n) ≤ c2*g(n)。由于c1≠0,c2≠0,f(n) ≥c1*g(n)可得g(n) ≤ 1/c1*f(n),同时,f(n) ≤c2*g(n),有g(n) ≥ 1/c2*f(n),即1/c2*f(n) ≤g(n) ≤ 1/c1*f(n),故g=Θ(f)。 3)Ο(f+g)= Ο(max(f,g)),对于Ω和Θ同样成立。 证明:设F(n)= Ο(f+g),则存在c1>0,和n1,使得?n≥n1,有 F(n) ≤ c1 (f(n)+g(n)) = c1 f(n) + c1g(n) ≤ c1*max{f,g}+ c1*max{f,g} =2 c1*max{f,g} 所以,F(n)=Ο(max(f,g)),即Ο(f+g)= Ο(max(f,g)) 对于Ω和Θ同理证明可以成立。 4)log(n!)= Θ(nlogn)

证明: ?由于log(n!)=∑=n i i 1 log ≤∑=n i n 1 log =nlogn ,所以可得log(n!)= Ο(nlogn)。 ?由于对所有的偶数n 有, log(n!)= ∑=n i i 1 log ≥∑=n n i i 2 /log ≥∑=n n i n 2 /2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。 当n ≥4,(nlogn)/2-n/2≥(nlogn)/4,故可得?n ≥4,log(n!) ≥(nlogn)/4,即log(n!)= Ω(nlogn)。 综合以上两点可得log(n!)= Θ(nlogn) 2. 设计一个算法,求给定n 个元素的第二大元素,并给出算法在最坏情况下使用的比较次数。(复杂度至多为2n-3) 算法: V oid findsecond(ElemType A[]) { for (i=2; i<=n;i++) if (A[1]

算法设计与分析试题与答案

一、填空题(20分) 1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性: 确定性,有穷性,可行性,0个或多个输入,一个或多个输出。 2.算法的复杂性有时间复杂性和空间复杂性之分,衡量一个算法好坏的标准是时间复杂度高低。 3.某一问题可用动态规划算法求解的显著特征是该问题具有最优子结构性质。 4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X和Y的一个最长公共子序列{BABCD}或{CABCD}或{CADCD}。 5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含一个(最优)解。 6.动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 7.以深度优先方式系统搜索问题解的算法称为回溯法。 8.0-1背包问题的回溯算法所需的计算时间为o(n*2n) ,用动态规划算法所需的计算时间为o(min{nc,2n})。 9.动态规划算法的两个基本要素是最优子结构和重叠子问题。 10.二分搜索算法是利用动态规划法实现的算法。 二、综合题(50分) 1.写出设计动态规划算法的主要步骤。 ①问题具有最优子结构性质;

②构造最优值的递归关系表达式; ③最优值的算法描述; ④构造最优解; 2.流水作业调度问题的johnson算法的思想。 ②N1={i|ai=bi}; ②将N1中作业按ai的非减序排序得到N1’,将N2中作业按bi的非增序排序得到N2’; ③N1’中作业接N2’中作业就构成了满足Johnson法则的最优调度。 3.若n=4,在机器M1和M2上加工作业i所需的时间分别为ai和bi,且 (a1,a2,a3,a4)=(4,5,12,10),(b1,b2,b3,b4)=(8,2,15,9)求4个作业的最优调度方案,并计算最优值。 步骤为:N1={1,3},N2={2,4}; N1’={1,3}, N2’={4,2}; 最优值为:38 4.使用回溯法解0/1背包问题:n=3,C=9,V={6,10,3},W={3,4,4},其解空间有长度为3 的0-1向量组成,要求用一棵完全二叉树表示其解空间(从根出发,左1右0),并画出其解空间树,计算其最优值及最优解。 解空间为{(0,0,0),(0,1,0),(0,0,1),(1,0,0),(0,1,1),(1,0,1), (1,1,0),(1,1,1)}。 解空间树为:

算法设计与分析课后习题

第一章 1. 算法分析题 算法分析题1-1 求下列函数的渐进表达式 (1). 3n^2 + 10n < 3n^2 + 10n^2 = 13n^2 = O(n^2) (2). n^2 / 10 + 2^n 当n>5是,n^2 < 2 ^n 所以,当n >= 1时,n^2/10 < 2 ^n 故: n^2/10 + 2^n < 2 ^n + 2^n = 2*2^n = O(2^n) (3). 21 + 1/n < 21 + 1 = 22 = O(1) (4). log(n^3)=3log(n)=O(log(n)) (5). 10log(3^n) = (10log3)n = O(n) 算法分析题1-6 (1)因为:f(n)=log(n^2) = 2log(n); g(n) = log(n) + 5 所以:f(n)=Θ(log(n)+5) =Θ(g(n)) (2)因为:log(n) < √n; f(n) = 2log(n); g(n)=√n 所以:f(n) = O(g(n)) (3)因为:log(n) < n; f(n) = n; g(n) = log(n^2) = 2log(n) 所以;f(n) = Ω(g(n)) (4)因为:f(n) = nlogn +n; g(n) = logn 所以:f(n) =Ω(g(n)) (5)因为: f(n) = 10; g(n) = log(10) 所以:f(n) =Θ(g(n)) (6)因为: f(n)=log^2(n); g(n) = log(n) 所以: f(n) ==Ω(g(n)) (7)因为: f(n) = 2^n < 100*2^n; g(n)=100n^2; 2^n > n ^2 所以: f(n) = Ω(g(n)) (8)因为:f(n) = 2^n; g(n) = 3 ^n; 2 ^n < 3 ^n 所以: f(n) = O(g(n)) 习题1-9 证明:如果一个算法在平均情况下的计算时间复杂性为Θ(f(n)),该算法在最坏情况下所需的计算时间为Ω(f(n)). 分析与解答: 因此,Tmax(N) = Ω(Tavg(N)) = Ω(Θ(f(n)))=Ω(f(n)). 第二章 算法分析题

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