字符串相似度实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
三、diagscan函数(扫描一条确定位置的对角线连续1的最长段)
void diagscan(int mat[MAX][MAX],int m,int n,int i,int j,int *maxlen,int *jpos)
{
/*从[i,j]开始沿对角线方向扫描最长的连续1,maxlen和jpos分别返回最长连续1的长度和起点的j坐标*/
printf("similarity=%4f\n",sim);
}
int minlen(int len1,int len2)
{
/*取两个整数值中较小的一个*/
if(len1<len2)
return len1;
else
return len2;
}
void stringncopy(char *string1,char *string2,int pos,int len)
scanf("%s",&wk.baidu.comt2);
blen=strlen(st2);
minl=minlen(alen,blen);
getmaxsamestr(st1,st2,maxsub);/*求st1和st2中的最大公共子串返回到maxsub*/
maxpub=strlen(maxsub);/*求maxsub的长度赋给maxpub*/
*maxlen=0;
*jpos=-1;/*右上的第一条对角线起始行坐标*/
for(k=-(n-1);k<=m-1;k++)/*当前处理特征量k的对角线,k=i-j*/
{
i=istart;
j=i-k;
diagscan(mat,m,n,i,j,maxlen,jpos);/*扫描特征量为k的对角线连续1的最长段*/
void diagmax(int mat[MAX][MAX],int m,int n,int *maxlen,int *jpos);
void getmaxsamestr(char *string1,char *string2,char *sub);
int minlen(int len1,int len2);
main()
{
int alen,blen,minl,maxpub;
char st1[MAX],st2[MAX],maxsub[MAX];
float sim;
printf("input string1.\n");
scanf("%s",&st1);
alen=strlen(st1);
printf("input string2.\n");
三、此次主要采用字符串的静态存储,实现的字符串比较有对字符串长度有限制(根据宏定义中的数据,不得多于100个字符)。
四、这一次实现了基本的字符串相似度计算及字符串比较矩阵的输出,但是没能实现文件调用和文段的比较这些较高的目标。
sim=((float)maxpub/minl);/*求相似度,公式:相似度=最大公共子串长度/st1和st2中较短者的长度*/
printf("length of string1=%5d\n",alen);
printf("length of string2=%5d\n",blen);
printf("length of max public string=%5d\n",maxpub);
else
stringncopy(sub,string2,jpos,maxlen);/*复制string2中jpos开始的maxlen个字符的子串*/
printf("maxsamestring:");
for(i=0;sub[i]!='\0';i++)
printf("%c",sub[i]);
putchar('\n');
for(k=-(n-1);k<=m-1;k++)/*当前处理特征量k的对角线,k=i-j*/
{
i=istart;
j=i-k;
diagscan(mat,m,n,i,j,maxlen,jpos);/*扫描特征量为k的对角线连续1的最长段*/
istart+=(k>=0)?1:0;/*k〉=0时,istart开始增加*/
需要的操作有:求字符串长度(strlen)(函数库<string.h>包含),从字符串string2的pos位置开始复制len个字符形成字符串(stringncopy)(函数库<string.h>不包含)
算法设计:
一、核心思路(getmaxsamestr)
1.建立矩阵mat[alen][blen](alen,blen分别为字符串st1,st2的长度),对其中元素mat[i][j],若st[i]与st[j]相同,则mat[i][j]赋值为1,否则赋值为0。
{
/*从[i,j]开始沿对角线方向扫描最长的连续1,maxlen和jpos分别返回最长连续1的长度和起点的j坐标*/
int eq=0,len=0,sj=0;
while(i<m&&j<n)
{
if(mat[i][j]==1)
{
len++;
if(!eq)/*第一个出现的1*/
{
eq=1;
sj=j;/*改变状态,记下当前位置*/
istart+=(k>=0)?1:0;/*k〉=0时,istart开始增加*/
}
}
void getmaxsamestr(char *string1,char *string2,char *sub)
{
/*求string1和string2的最大字串返回到sub,假设sub已分配空间*/
int i,j,m,n,maxlen=0,jpos=0;
{
/*复制string2中pos开始的len个字符的子串赋给string2*/
int i=0;
while(string1[pos+i]!='\0'&&(i<len))
{
string1[i]=string2[pos+i];
i++;
}
string1[i]='\0';
}
void diagscan(int mat[MAX][MAX],int m,int n,int i,int j,int *maxlen,int *jpos)
int eq=0,len=0,sj=0;
while(i<m&&j<n)
{
if(mat[i][j]==1)
{
len++;
if(!eq)/*第一个出现的1*/
{
eq=1;
sj=j;/*改变状态,记下当前位置*/
}
}
else if(eq)/*上一个连续1结束*/
{
if(len>*maxlen)/*目前求得的连续1最长*/
}
输出结果:截图一
截图二
实验总结与心得:
一、这一次实验需要使用字符串,所以应该注意利用头文件string.h,这样节约了时间,不用再去写函数strlen。
二、函数的参数涉及到较多的数组和指针,应该小心检查这一类的编译错误,特别是涉及返回值的时候。还有,参数命名尽量与其作用有关,这样方便调试和debug,尤其是在本次的函数参数较多的状况下(最多的diagscan有7个参数)。
{
*maxlen=len;
*jpos=sj;
}
}
void diagmax(int mat[MAX][MAX],int m,int n,int *maxlen,int *jpos)
{
/*求矩阵mat中对角线方向上连续1的最长长度maxlen和起点的j坐标jpos*/
int istart=0,i=0,j=0,k=0;
#include<string.h>
#define MAX 100
void stringncopy(char *string1,char *string2,int pos,int len);
void diagscan(int mat[MAX][MAX],int m,int n,int i,int j,int *maxlen,int *jpos);
char *p1,*p2;
int mat[MAX][MAX]={0};
p1=string1;
m=strlen(string1);
p2=string2;
n=strlen(string2);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
mat[i][j]=(string1[i]==string2[j])?1:0;
void diagmax(int mat[MAX][MAX],int m,int n,int *maxlen,int *jpos)
{
/*求矩阵mat中对角线方向上连续1的最长长度maxlen和起点的j坐标jpos*/
int istart=0,i=0,j=0,k=0;
*maxlen=0;
*jpos=-1;/*右上的第一条对角线起始行坐标*/
2.求出矩阵mat中对角线方向最长连续1的长度maxlen和起点的j坐标jpos(利用diagmax函数)。
3.根据2的结果,利用stringncopy函数(从字符串string2的pos位置开始复制len个字符形成字符串)得到最大公共子串,计算出相似度。
二、diagmax函数(求出矩阵mat中对角线方向最长连续1的长度maxlen和起点的j坐标jpos)
}
}
else if(eq)/*上一个连续1结束*/
{
if(len>*maxlen)/*目前求得的连续1最长*/
{
*maxlen=len;
*jpos=sj;
}
eq=0;
len=0;/*重新开始下一个连续1的扫描*/
}
i++;
j++;
}
if(len>*maxlen)/*一个长连续1到达边界而没碰到下一个0*/
{
*maxlen=len;
*jpos=sj;
}
eq=0;
len=0;/*重新开始下一个连续1的扫描*/
}
i++;
j++;
}
if(len>*maxlen)/*一个长连续1到达边界而没碰到下一个0*/
{
*maxlen=len;
*jpos=sj;
}
}
源程序:
#include<stdio.h>
#include<stdlib.h>
for(i=0;i<m;i++)/*输出矩阵mat*/
{
for(j=0;j<n;j++)
printf("%2d",mat[i][j]);
putchar('\n');
}
diagmax(mat,m,n,&maxlen,&jpos);/*求矩阵mat中对角线方向最长1*/
if(maxlen==0)
sub[0]='\0';
数据结构实验报告二——字符串相似度
实验题目:求字符串的相似度
实验目标:
实现两字符串比较,输出字符串比较对应的矩阵、两字符串的长度、最大公共子串及其长度,并用“相似度=最大公共子串的长度/两字符串中较短者的长度”这一公式求出两字符串的相似度。
数据结构:
字符串和数组(二维)。字符串采用静态顺序存储(数组空间),二维数组则实现了字符串比较矩阵mat。
相关文档
最新文档