实验项目一串匹配问题

实验项目一串匹配问题
实验项目一串匹配问题

实验项目一串匹配问题

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("匹配的起始下表为:%d\n",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("匹配的起始下标为:%d\n",r);

else

printf("匹配失败");

}

6.实验结果

BF算法实验结果

KMP算法实验结果

BM算法实验结果

时间复杂度分析

算法时间复杂度BF O(n*m)KMP O(n)

BM O(n/3)7.试验心得

相关主题
相关文档
最新文档