通俗理解KMP算法

通俗理解KMP算法

前言

如果要比较字符串是否相等或包含,通常的情况下一般是一个个迭代的去比较,比如要比较的字符串长度为20,那么就要比较20次,这样的效率是非常低的。

作用

上面的字符串比较效率太低,我们是否能够获得已知的情况,来减少对字符串判断的次数呢?比如说子字符串(要比较的字符串)和父字符串(被比较的字符串)来比较是否相等,首先子字符串匹配了前面的3个字符都相等,那我们是否可以跳过3个长度呢?因为3个字符都已经匹配过了,所以不用在匹配了,这样对一个个迭代好得多。说的不清楚,那就看图文吧!

没有使用KMP算法的字符串比较

步骤一:

首先 f 和 a比较,发现不等于,然后前进一位

步骤二:

f 又和 b比较,发现不等于,然后又前进一位,直到匹配父字符串的f

步骤三:

子字符串的f和父字符串的f,匹配相等,然后匹配第二个字符串a,然后发现a和b不等,然后继续迭代。(请不要在意父字符的长度到了尾部,懂是这个意思就可以了。)

步骤四:

子字符串的f和父字符串的b并不相等,而父字符串后面没有字符了,因此可只父字符串并没有包含字符串。

为了得出这个结论,我们把父字符串的所有字符都比较了一次,如果有长度为100的父字符串,难道我们要比较100次吗?那如果有1M大小的字符串呢?

使用KMP算法

步骤一:

假设我们有这么一张表,先别管这表干嘛的,也别管表的数据是怎么来的,后面会说。

步骤二:

首先还是同样的步骤,子字符串一直对比到父字符串的A处

步骤三:

子:A和父:A 一样,在比较下一个字符B又是一样的,然后直到子D和父A,那里就不一样了,注意我们不会在一个个比较,我们要通过KMP算法得出要跳四位。

问题:

那你是怎么用KMP算法得出要跳四位呢?

在步骤一的那个表中,最后一个配置值:B,对应的是2,然后用公式:已匹配的字符数-对应的部分匹配值=移动位数,那么就是6-2=4

然后就跳四位:

后面的依次论推,现在重点是看那张表是怎么算的。

表的由来

我们是通过子串:A B C D A B D来计算出那神奇的表格。

我们将它们拆分:

  • A的前缀和后缀为空,共有元素长度为0
  • AB的前缀为A,后缀为B,共有元素长度为0
  • ABC的前缀为[A,AB],后缀为:[BC、C],共有元素长度为0
  • ABCD的前缀为[A,AB,ABC],后缀为[BCD、CD、D],共有元素长度为0
  • ABCDA的前缀为[A、AB、ABCD],后缀为[BCDA、CDA、DA、A],有一个共有元素A,所以长度为1

后面的自己就可以推出来了,这就表数据的来由,而这种跳跃的算法也就是KMP算法啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值