kmp模式匹配算法

KMP字符串模式匹配算法: 是由Knuth,Morris,Pratt共同提出的模式匹配算法,其對於任何模式和目標序列,均可以在線性時間內完成匹配查找,而不會發生退化。KMP算法的核心跳轉表next進行了多個層面的優化和抽象,使得KMP算法進行模式匹配的原理顯得不那麼直白。算法

KMP算法是一個很是優秀的字符串模式匹配算法,我這樣說,你們可能以爲有點唐突,那咱們就先來看一下樸素匹配算法。優化

樸素匹配算法: 將目標串S中某個位置i起始的子串和匹配串T相比較。即從 j=0 起比較 S[i+j] 與 T[j],若相等,則在目標串 S 中存在以 i 爲起始位置匹配成功的可能性,繼續日後比較( j逐步增1 ),直至與T串中最後一個字符相等爲止,不然改從S串的下一個字符起從新開始進行下一輪的"匹配",即將串T向後滑動一位,即 i 增1,而 j 退回至0,從新開始新一輪的匹配。spa

例:在串S=」abcabcabdabba」中查找T=」 abcabd」字符串

從T[0]一直比較到T[5]才與S[5] 不等。 這樣就匹配失敗了,T串向後移動一位原理

一開始T[0]與S[1]就不相等,匹配失敗,T串繼續向後移動一位。。。。。。程序

一直移動到T串的T[0]與S[3]對齊時,發現目標串與匹配串徹底相同,算法結束,此時的時間複雜度爲 O(m*n) ,而後回到今天的主角---->KMP算法,他的時間複雜度只有 O(m+n) 。im

KMP字符串模式匹配算法: 當目標串S中的某個子部S[m...m+(i-1)]與T串的前i個字符T[1...i]相匹配時,若是S[m+i]與T[i+1]匹配失敗,程序不會像樸素匹配算法那樣,將T[1]與S[m+1]對其,而後由S[m+1]向後逐一進行匹配,而是會將模式串T向後移動i+1 - next[i+1]個字符,使得T[next[i+1]]與S[m+i]對齊,而後再由S[m+i]向後與依次執行匹配。next

例:在S串「babcbabcabcaabcabcabcacabc」中查找T「abcabcacab」img

未完待續移動

相關文章
相關標籤/搜索