字符串匹配:kmp,bm和sunday算法

1.KMP算法

先了解一下KMP的核心,跳转表:
跳转表是对于模式字符串而言,即你需要在目标字符串匹配到的内容。

例如你想在ababdbccbababcd中匹配到baba,那么baba就是模式字符串。
下面介绍跳转表的实现方法:
跳转表的匹配是匹配前后缀,匹配目标是永远从第一个字符开始的字符串的字串,例如baba这个字符串:

匹配目标 前缀 后缀 跳转值
ba b a 0
bab b,ba b,ab 1

可以看出前缀和后缀永远是从左到右有序的。

跳转表的使用:
在匹配时:
ababdbccbababcd
baba
无匹配,往后移动一位
ababdbccbababcd
 baba
匹配到三个,第四个a无匹配,然后去找含有三个元素子串的对应值,其对应值为1,即向后移(长度-对应值个)单位,即移两个单位,这个原理是我们运用已匹配的数据,比如例子中的bab,因为我们已经知道了这三个已经匹配到绝对不会全是我们需要的,然后我们通过前面的匹配知道了b是重复元素,那么我们可以利用后面这个已经匹配的b来加速我们的判断过程。

2.BM算法

BM算法不仅比KMP简单,而且具有更高的效率。
BM算法的核心在于从后向前匹配以及不包含项目的快速跳转。
还是以KMP中的例子为例介绍BM算法,我们想在ababdbccbababcd中匹配到baba。
先将两个字符串对其,得:
ababdbccbababcd
baba
从后往前匹配时,我们发现最后一个就已经不匹配了,我们将其往后移一位,得:
ababdbccbababcd
 baba
发现最后一个仍然不匹配,并且d不在我们的模式串里,那么我们可以直接后移一个模式串的距离。

3.Sunday算法

有了前两个的基础,sunday算法也很好理解

还是以KMP中的例子为例,我们想在ababdbccbababcd中匹配到baba。
先将两个字符串对齐,得:
ababdbccbababcd
baba
从前向后匹配,我们发现并不匹配,然后找不匹配部分的下一个字符,即d字符,然后发现d不在模式串中,那我们直接往后移动一个模式串+1的距离,即:
ababdbccbababcd
          baba
然后从前向后匹配,发现第二个不匹配,这时候找到不匹配部分的下一个字符,即a,然后将模式串里的a和其对齐,注意模式串是从后向前扫描的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章