KMP算法

八月 5, 2012 at 7:00 下午Easton
查找算法实例

让我们用一个实例来演示这个算法。在任意给定时间,本算法被两个整数 m 和 i 所决定: m 代表主文字符串S 内匹配字符串 W 的当前查找位置;i 代表匹配字符串W当前做比较的字符位置。图示如下:

m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W: ABCDABD
i: 0123456

我們從 W 與 S 的開頭比較起。我們比對到 S[3](=' ') 時,發現 W[3](='D') 與其不符。接著並不是從S[1]比較下去。我們已經知道 S[1]~S[3]不與 W[0] 相合。因此,略過這些字元,令 m = 4 以及 i = 0。

m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W: ABCDABD
i: 0123456

如上所示,我們檢核了 "ABCDAB" 這個字串。然而,這與目標仍有些差異。我們可以注意到,"AB"在字串頭尾處出現了兩次。這意味著尾端的"AB" 可以作為下次比較的起始點。因此,我們令 m = 8, i = 2,繼續比較。圖示如下:

m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W: ABCDABD
i: 0123456

於 m = 10, i = 2 的地方,又出現不相符的情況。類似地,令 m = 11, i = 0 繼續比較:

m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W: ABCDABD
i: 0123456

這時,S[17](='C') 不與 W[6]相同,但是亦出現了兩次 "AB",我們採取一貫的作法,令 m = 15 和 i = 2 ,繼續搜尋。

m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W: ABCDABD
i: 0123456

我們找到完全匹配的字串了,其起始位置於 S[15] 的地方。

Posted in: 技术文章

Tags:

添加评论

  Country flag

biuquote
  • 评论
  • 在线预览
Loading