实验项目一串匹配问题

实验项目一串匹配问题

2023年7月20日发(作者:)

实验项目一 串匹配问题

1. 实验题目

给定一个文本,在该文本中任意查找并定位任意给定字符串。

2. 实验目的

(1) 深刻理解并掌握蛮力法的设计思想;

(2) 提高应用蛮力法设计算法的技能;

(3) 理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能。

3. 实验要求

(1) 实现BF算法;

(2) 实现BF算法的改进算法:KMP算法和BM算法;

(3) 对上述三个算法进行时间复杂性分析,并设计实验程序验证分析结果。

4. 实验提示

BF算法,KMP算法和BM算法都是串匹配问题中的经典算法,BF算法和KMP算法请参见本章第3.2节。下面介绍BM算法。

BM算法是Boyer和Moore共同设计的快速匹配算法。BM算法与KMP算法的主要区别是匹配操作的方向不同。虽然BM算法仅把匹配操作的字符比较顺序改为从左到右,但匹配发生失败时,模式T右移的计算方法却发生了较大的变化。

5. 实验代码

BF算法代码

#include

#include

#define N 50

void main()

{

char a[N],b[N];

printf("请输入待匹配的两个字符串,主串a为:n");

gets(a);

printf("模式串b为:n");

gets(b);

int i=1,j=1,s,t;

s=strlen(a);

t=strlen(b);

while(i

if(a[i]==b[j]){

i++;

j++;

}

else{

i=i-j+2;

j=1;

}

} if(j>=t)

printf("从a串的%d个字符开始匹配n",i-j+1);

else

printf("匹配失败n");

}

KMP算法代码

#include

#include

#define N 50

void GetNext(char t[],int next[])

{

next[1]=0;

int j=1,k=0,h;

h=strlen(t);

while(j

if((k==0)||(t[j]==t[k]))

{

j++;

k++;

next[j]=k;break;

}

else

k=next[k];

}

void main(){

char s[N],t[N];

int next[N]={0};

printf("请输入主串s:n");

gets(s);

printf("请输入模式串t:n");

gets(t);

int i=1,j=1,k=strlen(s)-1,h=strlen(t)-1;

while((i<=k)&&(j<=h))

{

if(s[i]==t[j]){

i++;

j++;

}

else{

GetNext(t,next);

j=next[j];

{if(j==0)

{ i++;

j++;

}

}

}

}

if(j>h)

printf("匹配的起始下表为:%dn",i-j+1);

else

printf("匹配失败n");

}

BM算法代码

#include

#include

#define N 50

int GetDist(char t[],char c){

int i,k=0;

int m;

m=strlen(t)-1;

for(i=m;i>0;i--){

if(t[i]==c){

k=i;break;

}

}

if((k!=m)&&(k!=0))

return m-k;

else

return m;

}

int BM(char s[],char t[],int n,int m){

int i,j;

i=m;

while(i<=n){

j=m;

while(j>0&&(s[i]==t[j])){

j=j-1;

i=i-1;

}

if(j==0){

return i+1;

break;

} else{

i+=GetDist(t,s[i]);

}

}

return 0;

}

void main(){

char s[N],t[N];

int r,n,m;

printf("请输入主串s:n");

gets(s);

printf("请输入模式串t:n");

gets(t);

n=strlen(s)-1;

m=strlen(t)-1;

r=BM(s,t,n,m);

if(r!=0)

printf("匹配的起始下标为:%dn",r);

else

printf("匹配失败");

}

6. 实验结果

BF算法实验结果

KMP算法实验结果 BM算法实验结果

时间复杂度分析

算法

BF

KMP

BM

7. 试验心得

时间复杂度

O(n*m)

O(n)

O(n/3)

发布者:admin,转转请注明出处:http://www.yc00.com/web/1689849939a290375.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信