蛮力法解决串匹配问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法分析实验报告

蛮力法-串匹配问题

学生姓名:

专业:

班级:

学号:

指导教师:

2017年6月12日

目录

一、实验题目 (2)

二、实验目的 (2)

三、实验要求 (2)

四、实现过程 (3)

1、实验设计: (3)

2、调试分析: (9)

3、运行结果:........ 错误!未定义书签。

4、实验总结: (9)

五、参考文献 (10)

一、实验题目

蛮力法-串匹配问题

二、实验目的

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

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

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

三、实验要求

1.[问题描述]:

给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配,T 称为模式。

设主串S=“abcabcacb”,模式=“abcac”。

2.[算法]:

蛮力法:蛮力法(也称穷举法或枚举法)是一种简单直接的解决问题的方法,常常直接基于问题的描述,所以,蛮力法也是最容易应用的方法,例如,对于给定的整数a和非负整数n,计算a n的值,最直接最简单的方法就是把1和a相乘n次,即:a n=a*a*a*···*a。

蛮力法所依赖的基本技术是遍历(也称扫描),即采用一定的策略依次处理待求解问题的所有元素,从而找出问题的解。依次处理所

有元素是蛮力法的关键,为了避免陷入重复试探,应保证处理过的元素不再被处理。用蛮力法设计的算法,一般来说,都可以对算法的第一个版本进行一定程度的改进,提高其时间性能,但只能减少系数,而数量级不会改变。

四、实现过程

1、实验设计:

●想法一:BF算法

1 在串S中和串T中设比较的下标i=1和j=1;

2 循环直到S中所剩字符个数小于T的长度或T中所有字符均比较完

2.1 k=i

2.2 如果S[i]=T[j],则比较S和T的下一字符,否则

2.2 将i和j回溯(i=k+1; j=1)

3 如果T中所有字符均比较完,则匹配成功,返回k,否则匹配失败,返回0

时间复杂度:设匹配成功发生在si处,则在i-1趟不成功的匹配中比较了(i-1)*m次,第i趟成功匹配共比较了m次,所以总共比较了i*m次,因此平均比较次数是:

一般情况下,m<

●想法二:KMP算法

实现过程:在串S 和串T 中高比较的起始下标i 和j ;循环直到S 中所剩字符小于T 的长度或T 的所有字符均比较完(如果S[i]=T[j],则继续比较S 和T 的下一个字符;否则将j 向右滑动到next[j]位置,即j=next[j];如果j=0,则将i 和j 分别+1,准备下趟比较,至于其中的next 在此不作详细讲解);如果T 中所有字符均比较完,则匹配成功,返回匹配的起始下标;否则匹配失败,返回0。 时间复杂度:当m<

图解过程

模式T

第一趟匹配,i=4,j=4失败,i 回溯到1,j 回溯到0

0 1 2 3 4 5 6 7 8 9

第二趟匹配,i=1,j=0失败,i回溯到2,j回溯到0

0 1 2 3 4 5 6 7 8 9

第三趟匹配,i=2,j=0,失败,i回溯到3,j回溯到0

0 1 2 3 4 5 6 7 8 9

第四趟匹配,i=8,j=5,T中全部字符都比较完毕,匹配成功

算法实现

1)BF

int BF(char S[],char T[],int index)

{

index=0;

int i=0,j=0;

while((S[i] != '\0') && (T[j] != '\0'))

{

if(S[i]==T[j])

{

i++;

j++;

}

else

{

index++;

i=index;

j=0;}

}

if(T[j]=='\0') return index+1;

else return 0;

}

2)KMP

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

{

int i,j,len;

next[0]=-1;

for(j=1;T[j]!='\0';j++)

{

for(len=j-1;len>=1;len--)

{

for(i=0;i

if(T[i] != T[j-len+i]) break;

if(i==len)

{

next[j]=len; break;

}

}

if(len<1) next[j]=0;

}

}

int KMP(char S[],char T[])

{

int i=0,j=0;

int next[80];

GetNext(T,next);

while(S[i] != '\0'&& T[j] != '\0') {

if(S[i]==T[j])

{

i++;j++;

}

else

{

j=next[j];

if(j==-1)

{

相关文档
最新文档