聪明文档网

聪明文档网

最新最全的文档下载
当前位置: 首页> 算法设计与分析第三章

算法设计与分析第三章

时间:2013-05-27 22:56:53    下载该word文档

第三章 作业答案

3

void GetNext(char T[ ], int next[ ])

{

next[1]=0;

next[2]=1;

j=T[0],k=0;

for(;j>2;j--){

for(n=j-2;n>=1;n--){//n为要比较的前缀的最后一个字符的下标

m=j-n;//m为要比较的后缀的第一个字符的下标

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

{

if(T[i]!=T[m+i-1])break;

}

if(i==n+1){next[j]=n+1;break;}

}

if(n==0)next[j]=1;

}

}

4.解:BF算法:

第一趟 a b a b c a b c c a b c c a c b a b

a b c

第二趟 a b a b c a b c c a b c c a c b a b

a

第三趟 a b a b c a b c c a b c c a c b a b

a b c c

第四趟 a b a b c a b c c a b c c a c b a b

a

第五趟 a b a b c a b c c a b c c a c b a b

a

第六趟 a b a b c a b c c a b c c a c b a b

a b c c a c

第七趟 a b a b c a b c c a b c c a c b a b

a

第八趟 a b a b c a b c c a b c c a c b a b

a

第九趟 a b a b c a b c c a b c c a c b a b

a

第十趟 a b a b c a b c c a b c c a c b a b

a b c c a c

由此可知,用BF算法一共要进行3+1+4+1+1+6+1+1+1+6=25次比较方能匹配出

KMP算法:next[]={,0,1,1,1,1,2};

第一趟 a b a b c a b c c a b c c a c b a b

a b c

第二趟 a b a b c a b c c a b c c a c b a b

a b c c

第三趟 a b a b c a b c c a b c c a c b a b

a b c c a c

第四趟 a b a b c a b c c a b c c a c b a b

a b c c a c

由此可知,用KMP算法一共要进行3+4+6+5=18次比较方能匹配出

6. 参考代码如下:

排列最终存储在长度为n的阶乘,元素类型为指针的数组中,数组指向一个排列,具体的排列数据存储在数组中。

int fabs(int n)

{

int r=1;

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

r=r*i;

return r;

}

//排列存储在数组中

void getArrangement(int* *&s,int n)

{

int * p,*q;

int * *s1;

int i,j,k,l,m,o;

s=new int *[1];

s[0]=new int[1];

s[0][0]=1;

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

{

j=0;

o=0;

m=fabs(i-1);

s1=new int *[fabs(i)];

while(o

{

q=p=s[o];

for(k=i-1;k>=0;k--)

{

s1[j]=new int[i];

for(l=0;l

{

if(l==k){s1[j][l]=i;}

else {

s1[j][l]=*p;

p++;}

}

j++;

p=q;

}

o++;

delete[] q;

}

delete[] s;

s=s1;

}

}

8

点集合中最左边或者最右边的点一定是凸包的一个极点,则求凸包的极点的问题转化为求点的x坐标最大或最小的点

int getPole(int x[],int y[],int n)

{

int r=0;

for(int i=0;i

{

if(x[i]>x[r])r=i;

}

return r;

}

11

两种思路:

1、 生成所有的组合,在组合中找元素个数为k个的组合。

伪代码:

1.初始化一个长度为n的比特串s=00…0并将对应的子集输出;

2for (i=1; i<2n; i++) //注意不能书写成i<=2n

2.1 s++

2.2 判断s1的个数,若为k,则将s对应的子集输出;

2、 使用k层嵌套循环生成元素个数为k个的组合。

k=3n个元素存储在数组a[]中;

伪代码:

for (i=1; i

for (j=i+1; i

for (k=j+1; i

输出a[i]a[j]a[k]构成的组合。

13.

参考代码:

#include

#include

int main()

{

long i,j,k,m;

for (i=1; i <=711/4 ; i++)

{

for (j=i; j <=711/3 ; j++)

{

for (k=j; k <=711/2 ; k++)

{

m=711-i-j-k;

if (i*j*k*m==711*1000000)

{

cout<

}

}

}

}

return 0;

}

输出结果为价格分别是1.2 1.25 1.5 3.16

免费下载 Word文档免费下载: 算法设计与分析第三章

  • 29.8

    ¥45 每天只需1.0元
    1个月 推荐
  • 9.9

    ¥15
    1天
  • 59.8

    ¥90
    3个月

选择支付方式

  • 微信付款
郑重提醒:支付后,系统自动为您完成注册

请使用微信扫码支付(元)

订单号:
支付后,系统自动为您完成注册
遇到问题请联系 在线客服

常用手机号:
用于找回密码
图片验证码:
看不清?点击更换
短信验证码:
新密码:
 
绑定后可用手机号登录
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系 在线客服