算法学习_字符匹配算法(BF,KMP,BM)
2014-03-11 21:47
295 查看
本文的内容都是来自<Cpp数据结构原理与经典问题求解>一书,除了一些笔者自己的理解描述外,并无原创。仅作笔记之用。
转入正题,首先是问题的定义,这里的字符匹配指的是连续的子串匹配,而不是公共子序列。举例:asdfgge和dfg是匹配的,因为asdfgge包含了dfg。问题就是判断子串A中是否包含子串B。
一、BF算法(蛮力求解法)
简单的将模式串与目标串对比,如果发生失配则回溯到模式串首位,重新开始比对整个模式串。
二、KMP算法
相较于BF,KMP的优化在于定义了失效函数来复用已经完成的比较过程。这里的失效函数指的是当发现某个字符不匹配时,对模式串进行移动的距离。
KMP算法的理论依据是在进行比对工作之前,我们可以知道模式串自身的情况。
![](http://img.blog.csdn.net/20140311200315250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYzODg4Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
三、BM算法
相对于KMP算法,BM算法更加高效。和一般的匹配算法不同,BM算法中模式串同样是从左到右移动的,但是其比对过程确实从右到左的。具体的算法理论依据如下,共有以下四种情况:
![](http://img.blog.csdn.net/20140310202337359?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYzODg4Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
A.如上图是,设已匹配的子串为u,因为b和已匹配的子串u左侧的a不相同,则如果在剩余未匹配的子串中找到相同的u且其左侧不为字符a,则将该u与目标串的u对齐,必将偏移量保存起来。
![](http://img.blog.csdn.net/20140310202357375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYzODg4Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
B.如果在剩余的子串中没有再到左侧不为a的子串u,则对齐模式串和u的最大子串V,并保存因此产生的偏移量。
显然情况A和B中每次只能发生一种情况。
![](http://img.blog.csdn.net/20140310202413343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYzODg4Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
C.不一子串U为可行解判读依据,而是以失配字符b为判断依据,检查整个模式串中的字符,看是否包含b,如果有就对齐b,并记录因此产生的偏移量。
![](http://img.blog.csdn.net/20140310202430421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYzODg4Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
D.如果这个模式串都不包含一个b字符,则说明模式串不可能与包含b的子串,直接将模式串移动到b的下一位,并保存因此产生的偏移量。
同样的,C和D一次也只可能发生一种情况。
最后,取Max(A or B,C or D)为最终偏移量。对模式串进行移动,然后再开始新的对比过程。下面分享一下笔者的疑问。
一、为什么要取偏移量的最大值?因为在任意一种情况的偏移范围内的解都不可能是最终解,即只有偏移量最大的解才有可能成为最终解。
二、这四种情况涵盖了所有的可解情况吗?答案是笔者也不知道,正如书上说的那样,证明起来很麻烦,对于笔者来说没有这个必要,理解解题思想就好了。
O啦~~~
转载请保留出处:/article/2121272.html
谢谢!!
转入正题,首先是问题的定义,这里的字符匹配指的是连续的子串匹配,而不是公共子序列。举例: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
谢谢!!
相关文章推荐
- BF,KMP,BM三种字符串匹配算法性能比较
- BM和KMP字符串匹配算法学习
- 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)
- 模式匹配算法BF和KMP
- 字符串匹配(BF,KMP,BM)
- 算法-KMP模式匹配算法学习
- 学习日志---串的匹配模式(BF和KMP)
- 字符串匹配算法之BF vs KMP
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法
- KMP匹配算法学习笔记
- KMP模式匹配算法学习
- Boyer-Moore(BM)算法学习
- 算法学习-KMP(字符串匹配)解释
- 数据结构学习:KMP模式匹配算法
- KMP 算法 学习 整理
- 数据结构编程笔记十一:第四章 串 定长顺序串以及模式匹配算法(BF和KMP)的实现
- 字符串匹配算法:KMP学习心得
- 字符串匹配从BF到BM再到KMP(一个非主流NEXT函数)
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
- sunday、kmp、 bm、 horspool字符串匹配算法 code