算法设计与分析习题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一章算法引论

1、算法的定义?

答:算法是指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程。

通俗讲,算法:就是解决问题的方法或过程。

2、算法的特征?

答:1)算法有零个或多个输入;2)算法有一个或多个输出; 3)确定性;4)有穷性

3、算法的描述方法有几种?

答:自然语言、图形、伪代码、计算机程序设计语言

4、衡量算法的优劣从哪几个方面?

答:(1) 算法实现所耗费的时间(时间复杂度);

(2) 算法实现所所耗费的存储空间(空间复杂度);

(3) 算法应易于理解,易于编码,易于调试等等。

5、时间复杂度、空间复杂度定义?

答:指的是算法在运行过程中所需要的资源(时间、空间)多少。

6、时间复杂度计算:

{i=1;

while(i<=n)

i=i*2; }

答:语句①执行次数1次,

语句②③执行次数f(n), 2^f(n)<=n,则f(n) <=log2n;

算法执行时间: T(n)= 2log2n +1

时间复杂度:记为O(log2n) ;

7.递归算法的特点?

答:①每个递归函数都必须有非递归定义的初值;否则,递归函数无法计算;(递归终止条件)

②递归中用较小自变量函数值来表达较大自变量函数值;(递归方程式)

8、算法设计中常用的算法设计策略?

答:①蛮力法;②倒推法;③循环与递归;④分治法;

⑤动态规划法;⑥贪心法;⑦回溯法;⑧分治限界法

9、设计算法:

递归法:汉诺塔问题?兔子序列(上楼梯问题)?

整数划分问题?

蛮力法:百鸡百钱问题?

倒推法:穿越沙漠问题?

答:算法如下:

(1)递归法

汉诺塔问题

void hanoi(int n, int a, int b, int c)

{if (n > 0)

{

hanoi(n-1, a, c, b);

move(a,b);

hanoi(n-1, c, b, a);

} }

兔子序列(fibonaci数列)

递归实现:

Int F(int n)

{

if(n<=2) return 1;

else

return F(n-1)+ F(n-2);

}

上楼梯问题

Int F(int n)

{

if(n=1) return 1

if(n=2) return 2;

else

return F(n-1)+ F(n-2);

}

整数划分问题

问题描述:将正整数n 表示成一系列正整数之和,n=n1+n1+n3+…

将最大加数不大于m 的划分个数,记作q(n,m)。正整数n 的划分数

p(n)=q(n,n)。 可以建立q(n,m)的如下递归关系:

递归算法:

Int q( int n, int m){

if(n<1||m<1) return 0;

If((n=1)||(m=1)) return 1;

If (n

If(n=m) return q(n,m-1)+1;

else

return q(n,m-1)+q(n-m,m); ⎪⎪⎩⎪⎪⎨⎧>>=<==-+--+=1

1,1),()1,()1,(1),(1),(m n m n m n m n m m n q m n q n n q n n q m n q

}

(2)蛮力法:百鸡百钱问题

算法设计1:

设x,y,z分别为公鸡、母鸡、小鸡的数量。约束条件:x+y+z=100 且5*x+3*y+z/3=100

main( )

{ int x,y,z;

for(x=1;x<=20;x=x+1)

for(y=1;y<=34;y=y+1)

for(z=1;z<=100;z=z+1)

if(100=x+y+z and 100=5*x+3*y+z/3)

{ print(the cock number is",x);

print(the hen number is", y);

print(the chick number is "z);}

}

算法分析:以上算法需要枚举尝试20*34*100=68000次。算法的效率显然太低

算法设计2:

在公鸡(x)、母鸡(y)的数量确定后,小鸡的数量 z就固定为100-x-y,无需再进行枚举了。此时约束条件只有一个: 5*x+3*y+z/3=100

main( )

{ int x,y,z;

for(x=1;x<=20;x=x+1)

for(y=1;y<=33;y=y+1)

{ z=100-x-y;

if(z mod 3=0 and

5*x+3*y+z/3=100)

{print(the cock number is",x);

print(the hen number is", y);

print(the chick number is "z);}

}

}

算法分析:以上算法只需要枚举尝试20*33=660次。实现时约束条件又限定Z能被3整除时,才会判断“5*x+3*y+z/3=100”。这样省去了z不整除3时的算术计算和条件判断,进一步提高了算法的效率。

(3) 倒推法:穿越沙漠问题

desert()

{ int dis,k,oil,k; 2)相同:都是将原问题分解成小问题,通过小问题求解得到原问题解。

不同:

用分治法求解时,分解的子问题是互相独立的,且与原问题类型一致。分治算法实现一般用递归;

动态规划方法经分解得到的子问题往往不是互相独立的;动态规划算法实现一般用循环;

3)基本要素:具有最优子结构;子问题具有重叠性

4)步骤:1)分析最优解的性质,并刻划其结构特征。

2)递推地定义最优值。

3)以自底向上的方式计算出最优值.

4)根据计算最优值时得到的信息,构造问题的最优解.

2、序列X={X1,X2,…Xm }和 Y={Y1,Y2…Yn}的最长公共子序列为Z={Z1,Z2,…Zk}用动态规划的方法求序列 X 和Y的最长公共子序列长度?

(要求按照动态规划写出动态规划求解问题的步骤分析①最优子结构②写出递归方程

相关文档
最新文档