软件安全实验报告一.docx
《软件安全实验报告一.docx》由会员分享,可在线阅读,更多相关《软件安全实验报告一.docx(8页珍藏版)》请在冰豆网上搜索。
软件安全实验报告一
软件安全实验一
实验报告
班级:
学号:
姓名:
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;
}