KMP与DFA(有限状态机)对比理解

简单理解

  1. 简单理解,KMP算法与DFA算法的核心目的都是使得字符匹配失败时不会从头再开始匹配,KMP就是用最长公共前后缀描述模式字符串的回退规律,然后按照这个回退规律来给待匹配字符串进行匹配,而DFA更为精细,使用有限状态机来描述规律,对不同的字符有不同的处理方式,前者所占的空间更小,后者匹配所用的时间应该更小(但都在一个时间复杂度下,也就是O(m+n))
  2. kmp的next数组的意义是,如果在j+1位置匹配不成功,那么最少要回退到next[j]才能继续进行尝试,暴力匹配中是回退到0,但其实不一定需要回退这么多,因为,对于已经匹配了的j个字符,next数组的“轴对称”性质保证了可以在回退next[j]的情况下,字符仍然是匹配的,
  3. 如果这里没有描述清楚,可以配合链接看图理解,如图,回退之后y仍然是对应的在这里插入图片描述
  4. 与dfa(有限状态机)/labuladong版相比,只用next数组的kmp算法相当于比dfa对状态倒退的指引更粗糙了,dfa直接按照情况告诉程序应该跳到哪个状态,而kmp算法则需要尝试,如下图属于dfa,对应的模式串是ABABC在这里插入图片描述
    它会直接告诉程序,在状态3遇到A应该回退到1,遇到C应该到0,而KMP会告诉程序最少回退2位,对应的next数组为[0,0,1,2,0],这样在状态3的时候如果没有遇到B,就会先回到1,发现仍然无法对应,于是再回退到0

参考

  1. 动态规划之 KMP 算法详解 (labuladong)
  2. 代码随想录对KMP的详解 (programmercarl.com)
  3. KMP 算法(Knuth–Morris–Pratt algorithm)的基本思想_杨领well的博客-优快云博客
  4. 在参考的许多资料里都说参考了《算法(第4版)》的思路或者模板,有时间的话拜读一下,应该会有许多收获
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值