字符串匹配问题 ---- 算法导论读书笔记

        字符串匹配是一个很常见的问题,可以扩展为模式的识别,解决字符串问题的思想被广泛地应用。介绍四种解决该问题的办法,包括:最朴素的遍历法,Rabin-Karp算法,自动机机匹配,Knuth-Morris-Pratt算法即耳熟能详的KMP。

        在一开始,先对时间复杂度做出一个总扩(从大到小):【1】朴素法:O( (n-m+1)m );【2】Rabin-Karp:预处理:O(m),匹配:最坏O( (n-m+1)m ),但是平均和实际中比这个好得多;【3】自动机:预处理O(m|Σ|),匹配O(n);【4】KMP:预处理O(m),匹配O(n)。  其中, m代表模式P的长度,n代表被匹配的数组S的长度,Σ代表P和S的字符表

        接下来分开说一下他们是怎么工作的,和他们的思想。

  • 朴素法
             朴素法很简单也容易想到,没多少可说的。就是从T的每一个字符开始,看它之后(包括它)的m个字符与P是否一样。P从S中第几个字符开始,可以看作,P在S中位移了几步。

             朴素法的效率低的问题在于,它几乎忽视了所有的信息,每一次匹配都是“全新地”。如果P=abc,S=abdabc,从位置0开始,当我们匹配到 位置2,即c != d,朴素的做法是下一步从位置1开始匹配, 然而,在之前的匹配过程中,我们可以知道位置1的值b必然不匹配位置0的a。这是我们光通过P就能知道的,因为既然前一步已经开始去匹配位置2了,证明说明0和1已经成功匹配,而通过P自己,我们知道P的位置1不匹配0,则前一步的S位置1必然也不匹配P的位置1,这样就可以跳过这一步。

             问题在于,告诉程序跳过多少步,这就是我们接下来的算法要做的。显然,跳过得越多匹配越快,同时我们为了尽可能得到跳步的信息,可能需要进行预处理,预处理会产生另外的时间。

</

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值