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