数据结构之串:KMP算法
串:KMP算法
- 基本概念:
- KMP算法原理:
- KMP算法的代碼實現:
- KMP算法的性能:
基本概念:
應用優化前提: 有部分匹配的前綴和后綴
KMP算法原理:
按普通的串的模式匹配算法,在1位置比較完之后,中間還有倆次比較才能到達位置2,KMP算法解決的就是如何找到直接找到位置2,繼續進行比較的。
問: 為什么會找到位置2而不是其他位置?
答: 我們發現在模式串的子串(bacba)中存在相同的最長前綴(ba)和最長后綴(ba),那進行串的模式匹配時下一個匹配的位置就是后綴=前綴的位置,即將前綴移動到上一次比較的后綴的位置上在進行比較。
當移動到下一個比較位置時,主串的標志i不需要回退,繼續向后比較即可
模式串的標志j就需要回退到相同前綴的下一個數據元素,回退的位數和部分匹配值相關,若用數組next[]存儲部分匹配值,則有以下公式:
j-1表示上次已經匹配的子串的最后一個元素的位置,next[j-1]表示部分匹配值
問: 如何計算存儲最長匹配值的數組next[]?
答:
前綴等于后綴的最長的串的長度
例:
考研當中上圖的next[]數組并不是最終答案,為實現算法的便利性,考研中的next[]數組會由此數組經過若干次變化得到,變化過程如下:
問: 最終的nextp[]數組如何求得?
答:
1、右移操作,將move中的next[j-1] 變成 next[j]
2、加一操作將j = next[j] + 1變成 j = next[j] (有的教程不加1,具體與代碼實現有關)
問: 如何更加高效的求解next[]數組?
答:
KMP算法的代碼實現:
求next[]數組:
void get_next(String T,int next[]){int i = 1,j = 0;next[1] = 0;while(i < T.length){if(j == 0 || T.ch[i] == T.ch[j]){++i;++j;next[i] = j;}elsej = next[j];} }
kmp算法:
KMP算法的性能:
時間復雜度: O(m + n)
空間復雜度: O(1)
總結
以上是生活随笔為你收集整理的数据结构之串:KMP算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Spring】Spring MVC文件
- 下一篇: Android应用开发基础篇(1)---