數據結構---KMP算法(1)

0.簡介

KMP算法,在方法上是一個比較難理解的,以前我只是記住了算法的具體步驟,不理解其中原理,久而久之就忘記了算法具體怎麼做了,最後只留下了KMP這三個字母。學習算法的目的可以有好多種,可以應付應用,可以應付考試,還可以學習細想,形成思維方式。本篇只介紹思想,不做實現。

1.字符串匹配

假設A爲主串,B爲匹配串,普通的匹配方法就是在A中去找B,並且一旦有一個字符不匹配,B就向後移動一次。

匹配

那麼,可不可以一次就將B串移動到一個更好的位置上呢,當然是可以的。

新方案

我們假定圖中字符串某次匹配到d字符匹配失敗,我們希望將B串的開頭移動到後面字符a開始的地方,那麼我們就得提前知道在B的abcab部分中,開頭的a和串中哪個位置的a能匹配的最長。

尋找自身匹配

就是圖中兩個方框中ab的位置,也就是在匹配算法開始之前,串B對於自身的不同位置應該如何最大匹配有了預先的計算,當匹配到d時候,發現匹配失敗,然後串abcab中,我們預先知道了開頭的a移動到第四位上的a是最佳選擇,這個最佳選擇是通過計算abcab串的開頭和結尾匹配最長結果選的,也就是每次分別從開頭和結尾取一樣長度的字符串,比較是否一致,選最長的,

a  b

ab  ab

abc   cab

abca   bcab

我們發現ab和ab是匹配的,也就是說將開頭的a移動到第四位開頭的a的位置就可以了。

那麼爲什麼不移動到,後面兩個a的位置?因爲此時還沒有比較到後面的a,我們只是假設比較多到d就匹配失敗了,所以直接跳到後面的a會導致字符串匹配不全。

2.總結

覺得說了一堆,還是說不清,主要思想就是,預先計算出串B的最佳移動方式,而這個最佳移動方式是串B根據自身的情況,來計算的,有效也是因爲B串開始到d字符截止之前,串A和串B的重疊部分是相同的,那麼對B串的這部分做預測就是對A串的這裏做 預測。將信息最大化利用了,這也是算法優化的一種思想。

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