BF算法和KMP算法详解

您所在的位置:网站首页 算法跟编程有什么区别 BF算法和KMP算法详解

BF算法和KMP算法详解

2024-07-13 16:23| 来源: 网络整理| 查看: 265

目录

串的模式匹配算法:

算法目的

算法种类

BF算法(穷举法)

KMP算法

BF算法

算法的思路

具体过程

子串位置的计算

代码实现

时间复杂度

KMP算法

 求解next的方法

求next[j+1]

         使用next数组来实现过程

代码实现

next 数组的优化

代码实现

 

串的模式匹配算法: 算法目的:

确定主串中所含子串(模式串)第一次出现的位置(定位)。

算法种类: BF算法(穷举法) KMP算法

特点:速度快

BF算法

Brute-Force简称为BF算法,亦称简单匹配算法,采用穷举法(将结果一一列出来的方法)的思路。

下面我们举个例子来理解一下:

主串S (正文串):   a   a   a   a   b   c   d

子串T (模式串):   a   b   c 

它的过程是这样的:

1.先比较前三个

发现不匹配

2.再比较后面的三个

发现还是不匹配

3.再继续比较后面的三个

发现还是不匹配

4.再继续比较

匹配成功

算法的思路:

从S的每一个字符开始依次与T的字符进行匹配。

理解了之后,我们来看一下这个算法的具体执行过程。

我们学了串的顺序存储法之后,知道了串是用一维数组来存的,为了方便,数组下标为0的位置不存元素,从下标为1的位置开始存,所以 i 和 j 的初值都是1(i 和 j 均表示下标)。

具体过程:

i=1,j=1

发现相同,所以让 i++,j++,得:

i=2,j=2

 发现相同,所以让 i++,j++,得:

i=3,j=3

发现相同,所以让 i++,j++,得: 

i=4,j=4

发现不相同,所以让 i 回溯(公式:i-j+2),即 i=2,让 j 回到最开始的位置,即 j=1,得:

i=2,j=1

 重复以上的比较过程:

 

直到这样,发现不相同,所以再让 i 回溯(公式:i-j+2),即 i=3,让 j 回到最开始的位置,即 j=1,得:

i=3,j=1

重复以上的比较过程: 

直到这样,S 和 T 里都没有元素了,这样就匹配成功了,另外除了这种情况以外,还可能出现:

1 .S里还有元素,但是T里面已经没有元素了:

这样的话也是匹配成功了。

2 .S里面已经没有元素了,但是T里面还有元素没有匹配

这样的话是匹配不成功。

子串位置的计算:

就是像上图这样算的,用当前的 i 减去子串的长度,就得到子串的位置了。

过程呢就是这样:

那么我们用代码来实现一下:

由于我用了string,所以下标都是从0开始的,所以:

 i 回溯时 回溯到 i-j+1的位置

 j 回退时 回退到 0 

 匹配失败时返回 -1

#include #include using namespace std; int Index_BF(string S,string T,int pos);//返回子串在主串中的位置 //pos表示从主串的第pos个位置开始查找子串 int main() { string S,T;//定义两个字符串 //赋值 S="aaaaab"; T="aaab"; //函数调用 int r=Index_BF(S,T,0);//表示从主串的第1个位置(下标为0的位置)开始查找子串 cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3