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++,

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

### BF算法KMP算法的优缺点及效率对比 #### 特点分析 BF(Brute Force)算法是一种简单的字符匹配方法,通过逐一字符比较模式目标中的子来实现匹配过程[^2]。而KMP(Knuth-Morris-Pratt)算法则利用已有的部分匹配信息,在遇到不匹配情况时不回溯已经检查过的字符位置,从而提高查找速度[^1]。 对于BF算法而言,当在某个位置上检测到失配时,会简单地将模式向右移动一位继续尝试新的起始位置进行匹配操作。这种处理方式虽然直观易懂,但在面对复杂场景特别是存在大量重复字符的情况下显得低效。 相比之下,KMP算法引入了一个称为`next`数组的数据结构用于记录前缀函数值,即最长相等前后缀长度。这使得一旦出现失配现象,可以根据预先计算好的跳转表快速定位下一个可能成功的候选位移量,减少了不必要的重新扫描次数。 #### 性能差异 - **时间复杂度** - BF算法的时间复杂度为O(m*n),其中m为目标长度,n为模式长度。这是因为每次发生失配都需要从头开始新一轮遍历直到找到完全一致为止。 ```python def bf_search(text, pattern): m = len(text) n = len(pattern) for i in range(m-n+1): j = 0 while(j<n and text[i+j]==pattern[j]): j += 1 if (j==n): return True return False ``` - KMP算法预处理阶段构建`next`数组所需时间为O(n),实际搜索过程中每步最多前进两个指针之一,因此整体平均情况下接近线性级别O(m+n)。 - **空间复杂度** - 对于BF算法来说几乎不需要额外存储空间支持其运行逻辑; - 而KMP需要维护一个大小等于模式长度加一(`n+1`)的整型数组作为辅助工具保存各状态转移关系,故占用内存稍多一些但仍然属于常数级开销范围之内。 #### 实际应用场景考量 如果待解决问题规模较小或者对实时响应要求不高,则可以直接选用易于理解编码实现的BF方案;反之针对大规模文本检索任务以及追求高效性的场合推荐采用优化后的KMP策略以获得更好的性能表现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值