BF算法和KMP算法分析

1.BF算法

BF算法
蛮力算法(Brute-Force),简称BF算法。

算法思想:
从主串T的的第一个字符起与子串P的第一个字符开始比较(主串的第一位由i记录,子串由j记录)。
若相等,i++ j++,然后继续对字符进行后续的比较;
若不相等,i返回到i-1处,j返回0处(回溯),再重新比较。
直至模式串中的每个字符依次和目标串中的一个连续的字符序列相等为止,此时称为匹配成功,否则匹配失败。

图解:
在这里插入图片描述

2.KMP算法

KMP算法
算法思想:
从主串T的的第一个字符起与子串P的第一个字符开始比较(主串的第一位由i记录,子串由j记录)。
若相等,i++ j++,然后继续对字符进行后续的比较;
若不相等,i位置不变,将B串后移,将B串的next[next[j-1]]处于i对齐,从next[next[j-1]]处开始比较(j为发生不匹配时所对应的j,k= next[j-1]),再重新比较。如果next[j-1]=0(相同的前后缀了)则直接把B串向后移一位,直到发现B串的第0位与A串的第i位可以匹配,再重复上面的匹配过程
直至模式串中的每个字符依次和目标串中的一个连续的字符序列相等为止,此时称为匹配成功,否则匹配失败。

Next[]数组的求法:

在这里插入图片描述

例:(KMP匹配过程)
在这里插入图片描述

next[j-1]=x 表示有x个相同的前后缀

1

匹配开始位置:

A串第0位(第1个字符、i=0)
B串第0位(第1个字符、next[0])

匹配结果:

A的第5位和B的第5位不匹配(注意从0开始编号)此时i=5,j=5
next[j-1]的值:next[5-1]=2
说明:B串的0-1位是与当前(i-2)-(i-1)是匹配的(绿色部分)

下次匹配位置:

A串第5位(第6个字符、i=5)
B串第2位(第3个字符、next[2])
在这里插入图片描述

2

匹配开始位置:

A串第5位(第6个字符、i=5)
B串第2位(第3个字符、next[2])

匹配结果:

A串的第13位和B串的第10位不匹配,此时i=13,j=10
next[j-1]的值:next[10-1]=4
说明:B串的0-3位是与当前(i-4)-(i-1)是匹配的(绿色部分)

下次匹配位置:

A串第13位(第14个字符、i=13)
B串的第4位(第5个字符、next[4])
在这里插入图片描述

3

匹配开始位置:

A串第13位(第14个字符、i=13)
B串的第4位(第5个字符、next[4])

匹配结果:

A串的第13位和B串的第4位依然不匹配,此时i=13,j=4
next[j-1]的值:next[4-1]=1
说明:B串的第0位是与当前i-1位匹配的

下次匹配位置:

A串第13位(第14个字符、i=13)
B串的第1位(第2个字符、next[1])

在这里插入图片描述

4

匹配开始位置:

A串第13位(第14个字符、i=13)
B串的第1位(第2个字符、next[1])

匹配结果:

B串的第1位与A串的第13位不匹配,此时i=13,j=1
next[j-1]的值:next[1-1]=0
说明:已经没有相同的前后缀了

下次匹配位置:

A串第13位(第14个字符、i=13)
B串的第0位(第1个字符、next[0])
Ps:直接把B串向后移一位,直到发现B串的第0位与A串的第i位可以匹配(此处i=13)再重复上面的匹配过程

在这里插入图片描述

5

匹配开始位置:

A串第13位(第14个字符、i=13)
B串的第0位(第1个字符、next[0])

匹配结果:

匹配成功!
在这里插入图片描述

另外强调一点,当我们将B串向后移的过程其实就是i++,而当我们不动B,而是匹配的时候,就是i++,j++,

代码小白,仅作学习记录📝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值