我有一个作业不会做了,请你们帮帮忙!
实验内容:比较BF算法和KMP算法的优劣
实验基本要求:
1.采用定长顺序显示表示串长的结构来存储串(结构定义见课件第15张幻灯片)
2.实现BF算法(即朴素算法),BF函数头如下:(参见课件第21张幻灯片)
int Index_BF(SString S, SString T) {}// 返回子串T在主串S中第0个字符之后的位置。若不存在,返回-1
3.实现getnext函数和kmp算法函数,参见课件第38和第45张幻灯片,函数头分别如下:
int Index_KMP(SString S, SString T){}//功能同Index_BF
void get_next(SString T, int next[]){}
4,编写主函数,分别定义SSsting类型的两个变量,并通过键盘输入串值,并为串设置串长,并分别验证两种匹配算法。
实验附加要求:
1,修改以上的两种算法函数,使之可以统计字符的比较次数,并最终输出类似以下信息:
主串长??,模式串长??
BF算法,比较次数为??
KMP算法,比较次数为??其中求next值比较的次数为??
2,编写一个过滤函数函数头如下,将字符串中的所有指定子串删除,如果不存在指定子串,则函数返回0,否则返回删除的子串数。并在主函数中进行测试。
int str_del(SString &S, SString T){}//删除S中的所有T子串,如S为”abcdabcdefa”,T为“abc”,则函数的返回为2,S变为“ddefa”
3,编写一个替换函数,将字符串中的指定子串用另外一个子串进行替换,如果不存在指定子串,则函数返回0,否则返回替换的子串数。并在主函数中进行测试。
int str_rep(SString &S, SString T, String P){}//将S中的所有T子串替换为P,如S为”abcdabcdefa”,T为“abc”,P为“dc”则函数的返回为2,S变为“dcddcdefa”
其中第一个我的源程序为:(有错误,但我不知道怎么改)
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MAXSTRKEN 20
int k_BF=0,k_KMP=0,k_next=0;
typedef struct
{
char ch[MAXSTRKEN];
int length;
}SString;
void get_next(SString T, int next[])
{
int j = 0,i = -1;
next[0] = -1;
while (j<T.length)
{
if ((i==-1) || T.ch[i] == T.ch[j])
{
++i;
++j;
next[j]=i;
}
else
i = next[i];
k_next++;
}
}
int Index_BF(SString S, SString T)
{
int i=0,j=0;
while (i <= S.length-1 && j <= T.length-1)
{
if (S.ch[i] == T.ch[j])
{
++i;
++j;
}
else
{
i = i-j+1;
j = 0;
}
k_BF++;
}
if (j =T.length)
return i-T.length;
else
return -1;
}
int Index_KMP(SString S, SString T)
{
int i = 0,j = 0;
while (i <= S.length -1 && j <= T.length -1)
{
if (j == -1 || S.ch[i] == T.ch[j])
{
++i;
++j;
}
else
j = next[j];
}
k_KMP++;
if (j =T.length)
return i-T.length;
else
return 0;
} // Index_KMP
int main()
{
int i,j;
SString S,T;
S.length=0;
T.length=0;
cout<<"ÇëÊäÈëÖ÷´®£ºS=";
while(S.ch[i]=getchar()!='\n')
{
i++;
S.length++;
}
cout<<"ÇëÊäÈëģʽ´®£ºT=";
while(T.ch[i]=getchar()!='\n')
{
i++;
T.length++;
}
Index_BF(S,T);
Index_KMP(S,T);
cout<<"主串长:"<<strlen(S.ch)<<endl;
cout<<"模式串长:"<<strlen(T.ch)<<endl;
cout<<"BF算法比较的次数:"<<k_BF<<endl;
cout<<"KMP比较的次数:"<<k_KMP*k_next<<endl;
cout<<"next比较的次数:"<<k_next<<endl;
}