最长公共子序列课程设计文档及源码_第1页
最长公共子序列课程设计文档及源码_第2页
最长公共子序列课程设计文档及源码_第3页
最长公共子序列课程设计文档及源码_第4页
最长公共子序列课程设计文档及源码_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计项目:说明:若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。设计要求:请使用C语言编程,设计一个有效的算法解决下述问题:给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。设计提示:设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk},则(1)若xm=yn,则zk=xm=yn,且zk-1是xm-1和yn-1的最长公共子序列。(2)若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列。(3)若xm≠yn且zk≠yn,则Z是X和yn-1的最长公共子序列。由此可见,2个序列的最长公共子序列包含了这2个序列的前缀的最长公共子序列。由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。用c[i][j]记录序列和的最长公共子序列的长度。其中,Xi={x1,x2,…,xi};Yj={y1,y2,…,yj}。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。故此时C[i][j]=0。其他情况下,由最优子结构性质可建立递归关系如下:课程设计目的:用c语言编程列出解决的方法,复习c语言的用法,提高动手实践能力课程设计内容需求分析:本演示程序中,输入的x序列和y序列是任意的,当然是在不超过MAXSIZE的前提下进行的;演示程序以用户和计算机的对话方式执行,即在计算机的终端上显示“提示信息”之后,由用户在键盘上输入相应数据(即X序列和Y序列)测试数据x序列:ADJdjfk48*&*dfj*&hj6GHh%$y序列:AhdhGHGF67HGHG^%&HGF%$输出:Adh6GH%$x序列:SDJFKJdkjfj^&*UJGHJ&^$y序列:SHJhjhd^&657HGH^$输出:SJd^&GH^$(3)其余省略概要设计voidlcs_length(char*x,char*y,intc[][MAXSIZE])c[i,j]记录序列Xi和Yj的最长公共子序列的长度根据下面条件,构造类似图lcs_length的表图Lcs_length2.intlcs(intc[][MAXSIZE],char*x,char*y,intlen_x,intlen_y,char*lcs_arr)把最长公共子序列存储在lcs_arr中,并返回子序列的长度详细设计元素类型:C[i][j]记录Xi和Yj序列的最长公共子序列长度Lcs_arr数组存储最长公共子序列的元素每个模块的分析主程序模块:intmain(void){inti,c;charx[MAXSIZE],y[MAXSIZE];while(1){printf("'y'tocontinue,andyoucaninputlistofxandy;'n'tostop:");c=getchar();if(c=='n'){ printf("Areyousuretoquit,'y'toquit,'n'tocontinue:"); getchar(); c=getchar(); if(c=='y'){ exit(1); } elseif(c=='n'){ getchar();printf("Pleaseinputthearrayofx(like:ABCDEF):");if(fgets(x,sizeof(x),stdin)==NULL)exit(1);printf("Pleaseinputthearrayofy(like:ABCDEF):");if(fgets(y,sizeof(y),stdin)==NULL)exit(1);intlen_x=strlen(x);intlen_y=strlen(y);intc[MAXSIZE][MAXSIZE];lcs_length(x,y,c);printf("Thelongestchildsequenceofxandyare:");lcs(c,x,y,len_x,len_y);printf("\n");}else{printf("theerrorinput,youshouldinput'y'or'n'\n\n");getchar();}} elseif(c=='y'){getchar();printf("Pleaseinputthearrayofx(like:ABCDEF):");if(fgets(x,sizeof(x),stdin)==NULL)exit(1);printf("Pleaseinputthearrayofy(like:ABCDEF):");if(fgets(y,sizeof(y),stdin)==NULL)exit(1);intlen_x=strlen(x);intlen_y=strlen(y);intc[MAXSIZE][MAXSIZE];lcs_length(x,y,c);printf("Thelongestchildsequenceofxandyare:");lcs(c,x,y,len_x,len_y);printf("\n");}else{printf("theerrorinput,youshouldinput'y'or'n'\n\n");getchar();}}return0;}构造lcs_length表模块//createthelcs_lengthtablevoidlcs_length(char*x,char*y,intc[][MAXSIZE]){inti,j;intlen_x=strlen(x);intlen_y=strlen(y);//Allofthefirstcolumnare0for(i=0;i<=len_x;++i)c[i][0]=0;//Allofthefirstroware0for(i=0;i<=len_y;++i)c[0][i]=0;for(i=1;i<=len_x;++i)for(j=1;j<=len_y;++j){//Thesituation:c[i][j]=c[i-1][j-1]+1(i,j>0;Xi=Yj)if(x[i-1]==y[j-1])c[i][j]=c[i-1][j-1]+1;//Thesituation:c[i][j]=max(c[i][j-1],c[i-1][j])(i,j>0;Xi!=Yi)elseif(c[i-1][j]>=c[i][j-1])c[i][j]=c[i-1][j];elsec[i][j]=c[i][j-1];}}找出最长子序列模块voidlcs(intc[][MAXSIZE],char*x,char*y,intlen_x,intlen_y){inti,j;if(len_x==0||len_y==0)return;if(x[len_x-1]==y[len_y-1]){lcs(c,x,y,len_x-1,len_y-1);printf("%c",x[len_x-1]);}elseif(c[len_x-1][len_y]>=c[len_x][len_y-1])lcs(c,x,y,len_x-1,len_y);elselcs(c,x,y,len_x,len_y-1);}函数调用关系图main()main()lcs_length()lcs()完整的程序#include<stdio.h>#include<string.h>#include<stdlib.h>#defineMAXSIZE100//createthelcs_lengthtablevoidlcs_length(char*x,char*y,intc[][MAXSIZE]){inti,j;intlen_x=strlen(x);intlen_y=strlen(y);//Allofthefirstcolumnare0for(i=0;i<=len_x;++i)c[i][0]=0;//Allofthefirstroware0for(i=0;i<=len_y;++i)c[0][i]=0;for(i=1;i<=len_x;++i)for(j=1;j<=len_y;++j){//Thesituation:c[i][j]=c[i-1][j-1]+1(i,j>0;Xi=Yj)if(x[i-1]==y[j-1])c[i][j]=c[i-1][j-1]+1;//Thesituation:c[i][j]=max(c[i][j-1],c[i-1][j])(i,j>0;Xi!=Yi)elseif(c[i-1][j]>=c[i][j-1])c[i][j]=c[i-1][j];elsec[i][j]=c[i][j-1];}}voidlcs(intc[][MAXSIZE],char*x,char*y,intlen_x,intlen_y){inti,j;if(len_x==0||len_y==0)return;if(x[len_x-1]==y[len_y-1]){lcs(c,x,y,len_x-1,len_y-1);printf("%c",x[len_x-1]);}elseif(c[len_x-1][len_y]>=c[len_x][len_y-1])lcs(c,x,y,len_x-1,len_y);elselcs(c,x,y,len_x,len_y-1);}intmain(void){inti,c;charx[MAXSIZE],y[MAXSIZE];while(1){printf("'y'tocontinue,andyoucaninputlistofxandy;'n'tostop:");c=getchar();if(c=='n'){ printf("Areyousuretoquit,'y'toquit,'n'tocontinue:"); getchar(); c=getchar(); if(c=='y'){ exit(1); } elseif(c=='n'){ getchar();printf("Pleaseinputthearrayofx(like:ABCDEF):");if(fgets(x,sizeof(x),stdin)==NULL)exit(1);printf("Pleaseinputthearrayofy(like:ABCDEF):");if(fgets(y,sizeof(y),stdin)==NULL)exit(1);intlen_x=strlen(x);intlen_y=strlen(y);intc[MAXSIZE][MAXSIZE];lcs_length(x,y,c);printf("Thelongestchildsequenceofxandyare:");lcs(c,x,y,len_x,len_y);printf("\n");}else{printf("theerrorinput,youshouldinput'y'or'n'\n\n");getchar();}} elseif(c=='y'){getchar();printf("Pleaseinputthearrayofx(like:ABCDEF):");if(fgets(x,sizeof(x),stdin)==NULL)exit(1);printf("Pleaseinputthearrayofy(like:ABCDEF):");if(fgets(y,sizeof(y),stdin)==NULL)exit(1);intlen_x=strlen(x);intlen_y=strlen(y);intc[MAXSIZE][MAXSIZE];lcs_length(x,y,c);printf("Thelongestchildse

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论