您的位置:首页 > 其它

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

2014-03-11 21:47 295 查看
本文的内容都是来自<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啦~~~

转载请保留出处:/article/2121272.html

谢谢!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: