String matching整理

来源:互联网 发布:java 替换大括号 编辑:程序博客网 时间:2024/06/05 03:26

主要根据算法导论上第32章整理。共四种匹配算法,开始先给出一个例子说明什么是string matching。


每个算法的时间复杂度如下:


算法导论中值得一提的是里面的语言很简练,没有一丝冗余。

1、The navie string-matching algorithm


2、The Rabin-Karp algorithm

它的思路就是利用排除法排除大部分不可能情况,然后对于可能的情况再一一匹配,看是否能成功。


3、String matching with finite automata

首先根据Pattern构造有限状态机,其定义如下:


给出一个例子:


构造有限状态机的算法如下:


有了状态机,当有text匹配时,就在这个状态机中跑。。。


最后给出一个完整的例子:


4、The Kuth-Morris-Pratt algorithm

这个就是经典的KMP算法,觉得最重要的还是了解其算法实质。


上图中,第6个字符(c, a)匹配失败,如果按照第一个算法,P直接回退到第一个开始和T的下一个进行比较,实际上,

在P[1-3] == P[3-5],所以当P[6]匹配失败时,我们可以回退到P[4],这样就大大的提高了效率。

注意,回退哪儿只跟P有关,和T没有一毛钱关系。

所以在Preprocessing 阶段,可以先就是π[1-m]。


给出一个例子


有了π,我们就可以来匹配T了。



所有这些方法,我都可以明白,觉得自己还是做得不过,学的仅仅是硬生生的方法,当你讲给别人听时,

别人会觉得这就是典型的中国式教育,不管三七二十一,直接告诉你怎么做,为什么这么做就不管了。

这个有时是有用,但希望自己还是把算法导论上的证明细节好好看看,领悟一下,为什么会是这样!

加油。

0 0
原创粉丝点击