软件安全实验报告一.docx

上传人:b****8 文档编号:11066044 上传时间:2023-02-24 格式:DOCX 页数:8 大小:143.76KB
下载 相关 举报
软件安全实验报告一.docx_第1页
第1页 / 共8页
软件安全实验报告一.docx_第2页
第2页 / 共8页
软件安全实验报告一.docx_第3页
第3页 / 共8页
软件安全实验报告一.docx_第4页
第4页 / 共8页
软件安全实验报告一.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

软件安全实验报告一.docx

《软件安全实验报告一.docx》由会员分享,可在线阅读,更多相关《软件安全实验报告一.docx(8页珍藏版)》请在冰豆网上搜索。

软件安全实验报告一.docx

软件安全实验报告一

软件安全实验一

实验报告

 

班级:

学号:

姓名:

 

1、实验目的

1.1理解基于最长公共子序列的协议特征提取方法

1.2实现字符串最长公共子序列的提取算法

2、实验过程

2.1算法流程图如下

2.2算法说明

引进一个二维数组c[][],用c[i][j]记录X[i]与Y[j]的LCS的长度,b[i][j]记录c[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向。

我们是自底向上进行递推计算,那么在计算c[i,j]之前,c[i-1][j-1],c[i-1][j]与c[i][j-1]均已计算出来。

此时我们根据X[i]=Y[j]还是X[i]!

=Y[j],就可以计算出c[i][j]。

问题的递归式写成:

回溯输出最长公共子序列过程:

算法分析:

由于每次调用至少向上或向左(或向上向左同时)移动一步,故最多调用(m+n)次就会遇到i=0或j=0的情况,此时开始返回。

返回时与递归调用时方向相反,步数相同,故算法时间复杂度为Θ(m+n)。

3、关键数据结构

(1)功能函数Lcs_Length():

构建并初始化二维数组,i和j分别从m,n开始,递减循环直到i=0,j=0。

其中,m和n分别为两个串的长度。

 ·如果str1[i]==str2[j],则将str[i]字符插入到子序列内,i--,j--;

 ·如果str1[i]!

=str[j],则比较L[i,j-1]与L[i-1,j],L[i,j-1]大,则j--,否则i--;(如果相等,则任选一个)

(2)功能函数Display_Lcs():

记录两个序列相同的字符,递归调用,并在主函数中记录输出。

4、实验结果截图如下

5、实验源代码如下

#include

usingnamespacestd;

constintX=100,Y=100;//串的最大长度

charresult[X+1];//用于保存结果

intcount=0;//用于保存公共最长公共子串的个数

/*功能:

计算最优值

*参数:

*x:

字符串x

*y:

字符串y

*b:

标志数组

*xlen:

字符串x的长度

*ylen:

字符串y的长度

*返回值:

最长公共子序列的长度

*

*/

intLcs_Length(stringx,stringy,intb[][Y+1],intxlen,intylen)

{

inti=0;

intj=0;

intc[X+1][Y+1];

for(i=0;i<=xlen;i++)

{

c[i][0]=0;

}

for(i=0;i<=ylen;i++)

{

c[0][i]=0;

}

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

{

for(j=1;j<=ylen;j++)

{

if(x[i-1]==y[j-1])

{

c[i][j]=c[i-1][j-1]+1;

b[i][j]=1;

}

else

if(c[i-1][j]>c[i][j-1])

{

c[i][j]=c[i-1][j];

b[i][j]=2;

}

else

if(c[i-1][j]<=c[i][j-1])

{

c[i][j]=c[i][j-1];

b[i][j]=3;

}

}

}

cout<<"计算最优值效果图如下所示:

"<

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

{

for(j=1;j

{

cout<

}

cout<

}

returnc[xlen][ylen];

}

voidDisplay_Lcs(inti,intj,stringx,intb[][Y+1],intcurrent_Len)

{

if(i==0||j==0)

{

return;

}

if(b[i][j]==1)

{

current_Len--;

result[current_Len]=x[i-1];

Display_Lcs(i-1,j-1,x,b,current_Len);

}

else

{

if(b[i][j]==2)

{

Display_Lcs(i-1,j,x,b,current_Len);

}

else

{

if(b[i][j]==3)

{

Display_Lcs(i,j-1,x,b,current_Len);

}

else

{

Display_Lcs(i-1,j,x,b,current_Len);

}

}

}

}

intmain(intargc,char*argv[])

{

stringx,y;

cout<<"请输入第一个字符串:

"<

cin>>x;

cout<<"请输入第二个字符串:

"<

cin>>y;

intxlen=x.length();

intylen=y.length();

intb[X+1][Y+1];

intlcs_max_len=Lcs_Length(x,y,b,xlen,ylen);

cout<<"最长公共子序列的长度为:

"<

Display_Lcs(xlen,ylen,x,b,lcs_max_len);

//打印结果如下所示

for(inti=0;i

{

cout<

}

cout<

return0;

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1