算法设计与分析基础第二章部分课后题答案

算法设计与分析基础第二章部分课后题答案(曲师大)

Exercise 2.1
1.
Question i ii iii
a n 相加 不会
b 二进制表中的数 相乘 不会
c n 两个数字不断比较 不会
d 两个输入数中较大的数的大小,或两个输入数中较小的数的大小,或两个输入数的大小之和。 模除运算 会
e 二进制表中的位数 从剩余的主要候选名单中剔出若干 不会
f n 两位数字乘法 不会
4.a:最好的情况下是2只,最差的情况下是12只
b:都在袜子丢失中,丢失的总情况数为C_102=45,假设丢失的恰好是同一双的概率是:(C_51)/(C_10^2 )=1/9,而丢失的是不同的两双的概率是:(C_5^2 C_2^1 C_21)/(C_102 )=8/9,通过求期望值是4×1/9+3×8/9=28/9。
9.a.n(n+1)=2000n^2
b.100n2<0.01n3
c.log_2⁡n=ln⁡n
d.log⁡(_22)n>log_2⁡〖n2 〗
e.2(n-1)=2n
f.(n-1)!<n!

Exercise 2.2
3. a.〖(n2+1)〗10≥(〖n2)〗10=n20∈Θ(n20)
lim┬(n→∞)⁡〖〖(n2+1)〗10/n^20 〗=lim┬(n→∞)⁡〖(〖(n2+1)/n2 )〗^10=〗 lim┬(n→∞)⁡〖(1+〖1/n^2 )〗^10=〗 1
b.√(〖10n〗2+7n+3)≥√(〖10n〗2 )=√10 n∈Θ(n)
lim┬(n→∞)⁡〖√(〖10n〗2+7n+3)/n=lim┬(n→∞)⁡√(10+7/n+3/n2 ) 〗=10
c.2nlg(n+2)2+(n+2)2 lg n/2=4nlg(n+2)+(〖(n+2)/√2)〗^2 lg⁡(〖n/2)〗^2
=4nlg(n+2)+(n+2)^2/2 lg n^2/4
=4nlg(n+2)+1/2 (n2+4n+4)(lgn2-lg4)
≥4nlg(n+2)+n^2/2 lgn2+2nlgn2
≥8nlgn+n^2/2 lgn2∈Θ(nlgn)+Θ(n2 lgn^2)
=Θ(n^2 lgn^2)

d.2(n+1)+3(n-1)=2n×2+1/3×3n=Θ(2^n )+Θ(3^n )=Θ(3^n )
lim┬(n→∞)⁡〖(2(n+1)+3(n-1))/3^n 〗=1/3<1

e.log_2⁡n-1≤[log_2⁡n ]≤log_2⁡n
log_2⁡n-1≥log_2⁡n-1/2 log_2⁡〖n=1/2〗 log_2⁡n
∴[log_2⁡n ]∈Θ(log_2⁡n )=Θ(log⁡n)

4.a.随着n的增大这些函数都会趋于正无穷,没有一个确定的函数值能证明他们的顺序。
b.(1)lim┬(n→∞)⁡〖log⁡n/n〗=lim┬(n→∞)⁡〖〖(log〗⁡〖n)’〗/n’〗=lim┬(n→∞)⁡〖1/n=0〗
∴log⁡〖n∈Ο(n)〗
(2) lim┬(n→∞)⁡〖n/(n log_2⁡n )〗=lim┬(n→∞)⁡〖1/log_2⁡n =0〗
∴n∈Ο(n log_2⁡n)
(3)由(1)式易得Θ(log⁡n)∈Θ(n^2)
(4)lim┬(n→∞)⁡〖n2/n3 〗=lim┬(n→∞)⁡〖1/n〗=0
∴n2∈Ο(n3)
(5) lim┬(n→∞)⁡〖n3/2n 〗=lim┬(n→∞)⁡〖(〖(n〗3)’)/(〖(2〗n)’)=lim┬(n→∞)⁡〖(3n2)/(2n ln2)=2/1n2〗 〗 lim┬(n→∞)⁡〖n2/2n =6/(〖1n〗^2 2)〗 lim┬(n→∞)⁡〖1/2^n 〗=0
∴n3∈Ο(2n)
(6)利用史特林公式易得2^n∈Ο(n!)
5. 由前至后分别属于的类型为:阶乘,对数,指数,幂函数,对数的平方,幂函数,指数函数,具体的优先级为:
〖5lg⁡(n+100)〗10,〖ln〗2 n,∛n,0.001n4+3n3+1,3n,22n,(n-2)!
Exercise 2.3
4.算法求得的是n项的平方和,基本操作是乘法,这个操作执行了n次,效率类型为Θ(n),假如我们使用二进制标的位数作为度量标准那么效率类型为Θ∈(2^b),其中b=[log_2⁡n+1],通过:
〖(n+1)〗3=n3+3n^2+3n+1
〖(n+1)〗3-n3=3n^2+3n+1
〖n3-(n-1)〗3=3(〖n-1)〗^2+3(n-1)+1
⋯⋯
33-23=3×2^2+3×2+1
23-13=3×1^2+3×1+1
求和得:
〖(n+1)〗3-1=3(12+22+32+⋯+n^2 )+3(1+2+3+⋯+n)+n
由于1+2+3+⋯+n=(n(n+1))/2
因此:n3+3n2+3n=3(12+22+32+⋯+n2 )+3 (n(n+1))/2+n
即:12+22+32+⋯+n2=(n(n+1)(2n+1))/6
10.10×10×10=1000
Exercise 2.4
4.a.Q(n)=Q(n-1)+2×n-1
Q(n-1)=Q(n-2)+2×(n-1)-1
⋯⋯
即:Q(n)=1+3+5+⋯+2×n-1=n(1+2×n-1)/2=n^2
代码:
#include
using namespace std;
int qu(int n)
{
if(n==1)
return 1;
else
return qu(n-1)+2*n-1;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cout<<qu(i)<<" ";
}
return 0;
}
运行结果:

由此可得:Q(n)=n^2
b.设乘法次数为M(n),其中M(1)=0,因为:
Q(2)=Q(1)+2×1-1
⋯⋯
Q(n-1)=Q(n-2)+2×(n-1)-1
Q(n)=Q(n-1)+2×n-1
因此:M(n)=n-1
c.设加减次数为C(n),其中C(1)=0,因为:
Q(2)=(Q(1)+2×1-1)or(Q(1)+2(2-1)-1)
⋯⋯
Q(n-1)=Q(n-2)+2×(n-1)-1
Q(n)=Q(n-1)+2×n-1
在一个在递推公式中如果以前者为标准C(n)=2(n-1),如果以后者为标准则C(n)=3(n-1)
9.代码:
#include
using namespace std;
int Riddle(int a[],int n)
{
int temp;
if(n==1)
{
return a[0];
}
else
{
int b[100];
for(int j=0;j<n-1;j++)
{
b[j]=a[j];
}
temp=Riddle(b,n-1);
if(temp<a[n-1])
{
return temp;
}
else
{
return a[n-1];
}
}

}
int main()
{
int n,a[100];
cout<<“输入一个整数n:”<<endl;
cin>>n;
cout<<“输入数:”<<endl;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
cout<<“最小的数为:”<<Riddle(a,n);
return 0;
}
运行结果:

该程序可以求列表最小值
通过temp值和数组末尾的元素的比较,因此设次数为C(n),则C(n)=n-1。
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值