课后练习2.4

来源:互联网 发布:vpn for mac 编辑:程序博客网 时间:2024/05/26 12:02

个人做的课后练习

书籍:算法设计与分析基础(第三版)

习题2.4

一.
a. 5*n-5
b. 4*pow(3,n-1)
c. n*(n+1)/2
d. 2*n-1
e. log3(n)+1

二.
n!的阶乘
F(n)=n*F(n-1),其中F(0)=1;
递归的次数是:n次

三.
a.加法:A(n)=A(n-1)+1,其中A(1)=0;
解得 A(n)=n-1
乘法:M(n)=M(n-1)+2,其中M(1)=0;
解得 M(n)=2*(n-1)
b.运用递归和运用循环计算这个问题。其做的加法和乘法次数都是一样的。个人偏向使用循环,递归算法占用的内存比较大。

四.
a.该算法计算的是 n的平方
b.乘法:M(n)=M(n-1)+1,其中M(1)=0;
解得 M(n)=n-1
c.加减法:A(n)=A(n-1)+2,其中A(1)=0;
解得 A(n)=2*(n-1)

五.
a.( pow(2,64)-1)/(365*24*60)
b. pow(2,i-1)+1
c. 直接用递推公式 M(n)=M(n-1)+1+M(n-1),从第一项开始计算。

HanoinM[0]←0    for i←1 to n do         M[i]M[i-1]+1+M[i-1]    return M[n]

六.
因为每一次都需要从B进行操作。我们可以假设把n个圆盘从A移到C中。假设把盘子移到相邻柱子所用步数为M(n);
首先,我们把A中的n-1个盘移动到B,然后,再把B中的n-1个圆盘移动到C,然后这时候把A中剩下的一个圆盘移动到B,再把C中的n-1个圆盘移动到B,然后再从B把n-1个圆盘移动到A,把B中剩下的一个圆盘移动到C,再把A中的n-1个圆盘移动到B,再移动到C,就完成了本次的操作了。
从上述中,我们可以得出一个公式:
2*M(n)=M(n-1)+M(n-1)+1+M(n-1)+M(n-1)+1+M(n-1)+M(n-1)=6*M(n-1)+2,其中M(1)=1;
解得有:2*M(n)=pow(3,n)-1

七.
a.可以直接用数学归纳法证明
b.递推关系有:M(n)=M(n/2)+1,其中M(0)=0;

八.
a.

value(n)    if n==0        return 1;    else        return value(n-1)+value(n-1);

b. A(n)=A(n-1)+1+A(n-1),其中A(0)=0;
解得 A(n)=pow(2,n)-1;

c. 这里就不作图了…
d.不是一个好的算法,因为这是一个指数规模的算法。

九.
a. 找到数组里面最小的元素
b. 基本的操作是:比较
J(n)=J(n-1)+1;J(1)=0;
解得 J(n)=n-1

十.
O(n*n)

十一.
a. 显然可以得到递推关系有:
M(n)=n*M(n-1),其中M(2)=2,M(1)=0;
解得 M(n)=n!

b. 如果依然按照这个思路,利用循环,从二阶矩阵开始算起的话。
计算二阶矩阵: n(n-1)/2
计算三阶矩阵: n(n-1)(n-2)/2

计算n阶矩阵:n!/2

如果使用n的排列计算行列式:
算法就是 n的全排序,也就是n!

十二.
M(n)=M(n-1)+4*n,其中M(0)=1;
解得 M(n)=2(n+1)n

十三.
a.

time(n)    if n==1 or n==2        return 2else        return time(n-2)+time2);

时间的关系:n/2向上取整*2

b.显然时间不是最少的,因为烤三个面包所需的时间是3分钟。
c.

time(n)    if n==3        return 3else if n==1 or n==2        return 2else        return time(n-3)+time3);

十四. 名人问题
从题目中,我们可以知道,所有人都认识名人,而名人不认识其他人。假如,A认识B,那么,证明了A不是名人;若,A不认识B,那么证明了B不是名人。所以,每判断一次,就可以排除一个,我们只需要n-1次,就可以筛选出最后那一个可能是名人的人。最后,我们只需要检验他到底认不认识其他人,和,其他人是否都认识他,判断有无名人。显然,这里需要2*(n-1)次,总体算法的复杂度是 O(n)

0 0
原创粉丝点击