else{x=A[r];y=A[l];}
return;
}
else{mid=(l+r)div2;
Maxmin2(A,l,mid,x1,y1);
Maxmin2(A,mid+1,r,x2,y2);
x=min(x1,x2);y=max(y1,y2);}
}
该算法利用的比较次数为:
4.给定多项式p(x)=anxn+an-1xn-1+…+a1x+a0,假设使用以下方式求解:
p=a0;
xpower=1;
for(i=1;i<=n;i++)
{xpower=x*xpower;
p=p+ai*xpower;
}
求
(1)该算法最坏情形下利用的加法和乘法别离为多少次?
(2)能不能对算法的性能进行提高?
解:
(1)该算法最坏情形下利用的加法n次,乘法2n次
(2)改良的算法为:
floatHorner(A,floatx)
{
p=A[n+1];
for(j=1;j<=n;j++)
p=x*p+A[n-j];
returnp;
}
该算法中利用加法n次,乘法n次
第二章
1.求解以下递推关系:
1)当n≥1时,f(n)=3f(n-1);f(0)=5
解:
f(n)=3f(n-1)=32f(n-2)=…=3nf(n-n)=3n*5=5*3n
2)当n≥2时,f(n)=5f(n-1)-6f(n-2);f(0)=1;f
(1)=0
解:
该递推关系的特点方程为:
x2-5x+6=0
特点根为:
r1=2;r2=3
故f(n)=c1*2n+c2*3n
有f(0)=c1*20+c2*30==c1+c2=1且f
(1)=c1*21+c2*31==2c1+c32=0
可得c1=3,c2=-2
故f(n)=3*2n-2*3n
3)当n≥1时,f(n)=f(n-1)+n2;f(0)=0
解:
f(n)=f(n-1)+n2
=f(n-2)+(n-1)2+n2
=….
=f(0)+12+22+…+(n-1)2+n2
=12+22+…+(n-1)2+n2
=1/6n(n+1)(2n+1)
4)当n≥1时,f(n)=2f(n-1)+n2;f(0)=1
解:
设f(n)=2nf’(n),且f’(0)=f(0)=1
那么2nf’(n)=2*(2n-1f’(n-1))+n2
即f’(n)=f’(n-1)+
=f’(0)+
=1+
因此f(n)=2n*(1+)=2n*(10-)=10*2n-(n+6)
5)当n≥1时,f(n)=nf(n-1)+1;f(0)=1
解:
f(n)=n!
*(f’(0)+)
=n!
*(1+)
2.求解下面的递推式:
当n≥2时,f(n)=4f(n/2)+n;f
(1)=1。
假设n为2的幂,用直接展开法求解递推式。
解:
令
f(n)=4f(n/2)+n
=
=
=
=….
=
=
=
=
3.求解下面的递推式:
当n≥2时,f(n)=9f(n/3)+n2;f
(1)=1。
假设n为3的幂,用直接展开法求解递推式。
解:
令
f(n)=
=
=
=
=….
=
=
4.法求解递推式的上界:
当n≥4时,;当n<4时,f(n)=4。
解:
由于递推式为
那个地址
故作猜想的解为:
故对原递推式做猜想
由于
=
假设使f(n)知足上界为那么必有
即
因此
故,即上界为
第三章
1.设计一个分治算法,判定两棵给定的二叉树T1和T2是不是相同。
采纳先序遍历算法来实现,其中访问结点的操作为“判定两个结点是不是相同”,若是t1和t2所指的结点均为空或均不为空且数据域的值相等,那么继续先序比较它们的左、右子树,不然返回0。
具体算法如下:
intEqualBtr(bitreptrt1,bitreptrt2)
{
if(t1==NULL&&t2==NULL)
return
(1);
if((t1==NULL&&t2!
=NULL)||t1!
=NULL&&t2==NULL)||(t1->data!
=t2->data))
return(0);
hl=EqualBtr(t1->Lchild,t2->Lchild);
hr=EqualBtr(t1->Rchild,t2->Rchild);
if(hl==1&&hr==1)
return1;
else
return0;
}
2.设计一个分治算法,求给定二叉树的高度。
设根结点为第一层的结点,所有k层结点的左、右小孩结点在k+1层。
因此,能够通过先序遍历计算二叉树中每一个结点的层次,其中最大值即为该二叉树的深度。
具体算法如下:
voidBtdepth(bitreptrt,intk,int&h)
计一个分治算法,在一个具有n个数的数组中找出第二大元素,并给出算法的复杂度。
typedefstructMyTwoMax
{
intMax;
intSecMax;
}MyMax;
MyMaxgetSecMax(intA[],intlow,inthigh)用分治法,求两个大整数X=5287,Y=3462的乘积。
解:
1)
x=5287 a=52 b=87 a-b=-35
y=3462 c=34 d=62 d-c=28
ac=(1768)
bd=(5394)
(a-b)(d-c)=(-980)
xy=ac104+[(ac+bd+(a-b)(d-c)]102+bd
=+(1768+5394-980)*100+5394
=
2)
a=52 a1=5 b1=2 a1-b1=3
c=34 c1=3 d1=4 d1-c1=1
a1c1=15 b1d1=8 (a1-b1)(d1-c1)=3
ac=1500+(15+8+3)10+8=1768
3)
b=87 a2=8 b2=7 a2-b2=1
d=62 c2=6 d2=2 d2-c2=-4
a2c2=48 b2d2=14 (a2-b2)(d2-c2)=-4
bd=4800+(48+14-4)10+14=5394
4)
|a-b|=35 a3=3 b3=5 a3-b3=-2
|d-c|=28 c3=2 d3=8 d3-c3=6
a3c3=6 b3d3=40 (a3-b3)(d3-c3)=-12
|(a-b)(d-c)|=600+(6+40-12)10+40=980
第四章
2.求对以下5个矩阵连乘:
M1:
4⨯5;M2:
5⨯4;M3:
4⨯6;M4:
6⨯4;M5:
4⨯5
1)求这5个矩阵连乘时所需要的最少乘法次数;
2)给出一个最优解。
解:
1)单个矩阵相乘:
C[1,1]==C[2,2]=0……=C[5,5]=0
2)相邻两个矩阵相乘:
C[1,2]=min(1C[2,3]=min(2C[3,4]=min(3C[4,5]=min(43)三个矩阵相乘:
C[1,3]=min(1=min{0+120+4*5*6,80+4*4*6}=176
C[2,4]=min(2=min{96+5*4*4,120+5*