3种字符串匹配算法原理笔记

1.Brute Force(暴力匹配)

算法步骤

对于给定的文本串 T 与模式串 p,求出文本串 T 的长度为 n,模式串 p 的长度为 m。
同时遍历文本串 T 和模式串 p,先将 T[0] 与 p[0] 进行比较。
如果相等,则继续比较 T[1] 和 p[1]。以此类推,一直到模式串 p 的末尾 p[m - 1] 为止。
如果不相等,则将文本串 T 移动到上次匹配开始位置的下一个字符位置,模式串 p 则回退到开始位置,再依次进行比较。
当遍历完文本串 T 或者模式串 p 的时候停止搜索。

算法分析
最坏每轮比较需要进行 m 次字符对比,总共需要进行 n -轮比较,总的比较次数为 m * n 。所以 BF 算法的最坏时间复杂度为O(m*n)

2.Rabin Karp 算法

算法思想:对于给定文本串 T 与模式串 p,通过滚动哈希算快速筛选出与模式串 p 不匹配的文本位置,然后在其余位置继续检查匹配项。

算法分析
RK 算法可以看做是 BF 算法的一种改进。在 BF 算法中,每一个字符都需要进行比较。而在 RK 算法中,总共需要比较 n - m + 1 个子串的哈希值,所以 RK 算法的整体时间复杂度为O(n),跟 BF 算法相比,RK 算法的效率提高了很多。
但是如果存在冲突的情况下,算法的效率会降低。最坏情况是每一次比较模式串的哈希值和子串的哈希值时都相等,但是每一次都会出现冲突,那么每一次都需要验证模式串和子串每个字符是否完全相同,那么总的比较次数就是 m * (n - m + 1) ,时间复杂度就会退化为 O(m*n)

3.KMP 算法

对模式串 p 进行了预处理,计算出前缀表,用一个数组 next 来记录。然后在每次失配发生时,不回退文本串的指针 i,而是根据前缀表中模式串失配位置 j 的前一个位置的值,即 next[j - 1] 的值来决定模式串可以向右移动的位数。

步骤
1.根据 next 数组的构造步骤生成「前缀表」next。
2.使用两个指针 i、j,其中 i 指向文本串中当前匹配的位置,j 指向模式串中当前匹配的位置。初始时,i = 0,j = 0。
3.循环判断模式串前缀是否匹配成功,如果模式串前缀匹配不成功,将模式串进行回退,即 j = next[j - 1],直到 j == 0 时或前缀匹配成功时停止回退。
4.如果当前模式串前缀匹配成功,则令模式串向右移动 1 位,即 j += 1。
5.如果当前模式串 完全 匹配成功,则返回模式串 p 在文本串 T 中的开始位置,即 i - j + 1。
5.如果还未完全匹配成功,则令文本串向右移动 1 位,即 i += 1,然后继续匹配。
6.如果直到文本串遍历完也未完全匹配成功,则说明匹配失败,返回 -1。

KMP 算法分析

KMP 算法在构造前缀表阶段的时间复杂度为O(m),其中 m是模式串 p 的长度。KMP 算法在匹配阶段,是根据前缀表不断调整匹配的位置,文本串的下标 i 并没有进行回退,可以看出匹配阶段的时间复杂度是 O(n),其中 n是文本串 T 的长度。所以 KMP 整个算法的时间复杂度是 O(n+m)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值