课程名称:数据结构
实验项目名称:串基本操作的实现
实验目的:
1.掌握串的模式匹配操作。
实验要求:
1、 分别使用BF和KMP算法完成串的模式匹配。
实验过程:
BF算法代码;;
1、 设计完成next值的计算函数;
2、 设计完成修正next值的函数;
3、 KMP算法代码;
4、 输入子串(aaac)和主串(aaabaaaaaac)
5、 输出子串在主串中开始的位置及不同算法比较的次数。
此部分实验报告中给出BF,next,修正next,KMP的代码。
实验结果:
输入: 子串:aaac; 主串:aaabaaaaaac
输出:BF,KMP,改进的KMP三种算法分别比较的次数及查找到的子串在主串中的位置。
例:
BF比较??次 子串位置:8
KMP比较??次 子串位置:8
改进KMP比较??次 子串位置:8
实验分析:
1.普通next和修正next的区别;
2.列举调试运行过程中出现的错误并分析原因。
要求:
(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 上传源程序到课堂派。顺序表的源程序保存为Stringindex.cpp。
#include<iostream>
using namespace std;
void Get_next(string T, int next[])//next
{
int i=0;
next[0]=-1;
int j=-1;
while(i < T.size())
{
if(j == -1 || T[i] == T[j])
{
++i;
++j;
next[i]=j;
}
else j=next[j];
}
}
void Get_nextval(string T, int nextval[])//修正next
{
int i=0;
nextval[0]=-1;
int j=-1;
while(i < T.size())
{
if(j == -1 || T[i] == T[j])
{
++i;
++j;
if(T[i] != T[j]) nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
void Index_BF(string S, string T)
{
int i=0;
int j=0;
int cnt=0;
while(i<(int)S.size() && j<(int)T.size())
{
if(S[i] == T[j])
{
++i;
++j;
}
else
{
i=i-j+1;
j=0;
}
cnt++;
}
if(j >=(int)T.size())
{
printf("BF比较%d次 子串位置: %d\n",cnt,i-(int)T.size()+1);
}
else puts("匹配失败");
}
void Index_KMP1(string S, string T, int next[])
{
int cnt=0;
int i=0;
int j=0;
while(i < (int)S.size() && j < (int)T.size())
{
if(j == -1 || S[i] == T[j])
{
++i;
++j;
}
else j=next[j];
cnt++;
}
if(j == (int)T.size())
{
printf("KMP比较%d次 子串位置: %d\n",cnt,i-(int)T.size()+1);
}
else puts("匹配失败");
}
void Index_KMP2(string S, string T, int next[])
{
int cnt=0;
int i=0;
int j=0;
while(i < (int)S.size() && j < (int)T.size())
{
if(j == -1 || S[i] == T[j])
{
++i;
++j;
}
else j=next[j];
cnt++;
}
if(j == (int)T.size())
{
printf("改进KMP比较%d次 子串位置: %d\n",cnt,i-(int)T.size()+1);
}
else puts("匹配失败");
}
int main()
{
int next[1000];
int nextval[1000];
puts("请输入主串");
string S;//主串
cin>>S;
puts("请输入子串");
string T;//子串
cin>>T;
Index_BF(S,T);
Get_next(T,next);//next
Index_KMP1(S,T,next);
Get_nextval(T,nextval);//修正next
Index_KMP2(S,T,nextval);
return 0;
}