算法学习_字符匹配算法(BF,KMP,BM)

      本文的内容都是来自<Cpp数据结构原理与经典问题求解>一书,除了一些笔者自己的理解描述外,并无原创。仅作笔记之用。

      转入正题,首先是问题的定义,这里的字符匹配指的是连续的子串匹配,而不是公共子序列。举例:asdfgge和dfg是匹配的,因为asdfgge包含了dfg。问题就是判断子串A中是否包含子串B。

      一、BF算法(蛮力求解法)

      简单的将模式串与目标串对比,如果发生失配则回溯到模式串首位,重新开始比对整个模式串。

      二、KMP算法

      相较于BF,KMP的优化在于定义了失效函数来复用已经完成的比较过程。这里的失效函数指的是当发现某个字符不匹配时,对模式串进行移动的距离。

      KMP算法的理论依据是在进行比对工作之前,我们可以知道模式串自身的情况。

 

      三、BM算法

      相对于KMP算法,BM算法更加高效。和一般的匹配算法不同,BM算法中模式串同样是从左到右移动的,但是其比对过程确实从右到左的。具体的算法理论依据如下,共有以下四种情况:

       A.如上图是,设已匹配的子串为u,因为b和已匹配的子串u左侧的a不相同,则如果在剩余未匹配的子串中找到相同的u且其左侧不为字符a,则将该u与目标串的u对齐,必将偏移量保存起来。

        B.如果在剩余的子串中没有再到左侧不为a的子串u,则对齐模式串和u的最大子串V,并保存因此产生的偏移量。

        显然情况A和B中每次只能发生一种情况。

         C.不一子串U为可行解判读依据,而是以失配字符b为判断依据,检查整个模式串中的字符,看是否包含b,如果有就对齐b,并记录因此产生的偏移量。

       D.如果这个模式串都不包含一个b字符,则说明模式串不可能与包含b的子串,直接将模式串移动到b的下一位,并保存因此产生的偏移量。

       同样的,C和D一次也只可能发生一种情况。

       最后,取Max(A or B,C or D)为最终偏移量。对模式串进行移动,然后再开始新的对比过程。下面分享一下笔者的疑问。

       一、为什么要取偏移量的最大值?因为在任意一种情况的偏移范围内的解都不可能是最终解,即只有偏移量最大的解才有可能成为最终解。

       二、这四种情况涵盖了所有的可解情况吗?答案是笔者也不知道,正如书上说的那样,证明起来很麻烦,对于笔者来说没有这个必要,理解解题思想就好了。

      O啦~~~

      转载请保留出处:http://blog.csdn.net/u011638883/article/details/20650119

      谢谢!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值