幫你理解KMP演算法以及怎麼求next陣列

2021-07-10 16:03:47 字數 1246 閱讀 1164

kmp演算法做的事情就是用來進行字串匹配,並且盡量高效地去移動模式串,避免不必要的匹配。

在字串a中找尋是否存在部分等於字串b,在這裡我們把b看做模式串,去跟字串a做匹配

這個匹配的規則是這樣的,對於模式串b的某一位出現了失配的情況,那麼如果前面存在最長k位的部分匹配,就將模式串向後移到讓模式串的k+1位對著主串當前位;如果前面不存在部分匹配,那麼不好意思,只能從頭開始重新匹配。

以模式串adabcadada為例:12

3456

78910

adab

cada

da

在第1位的a失配的時候,由於a前面並沒有模式串的部分和主串匹配,所以在主串的下一位還將和模式串的第1位a進行匹配,也就是說在當前第1位a處的主串和第0位(第1位的a之前的部分)去匹配;

在第2位的d失配的時候,由於d前面並沒有模式串的部分和主串匹配,所以在主串的這一位將和模式串的第1位a重新開始匹配;

在第3位的a失配的時候,由於a前面並沒有模式串的部分和主串匹配,所以在主串的這一位將和模式串的第1位a重新開始匹配;

在第4位的b失配的時候,發現b前面存在第3位的a和模式串開頭的a匹配,並且這是匹配的最大距離了,所以在下一次匹配的時候,第1位的a將移到現在第3位的a這個位置,那麼現在的第4位就變成了模式串的第2位;

在第5位的c失配的時候,由於c前面並沒有模式串的部分和主串匹配,所以在主串的這一位將和模式串的第1位a重新開始匹配;

第6位同理第3位,當該位置失配時,和模式串第1位匹配;

第7位同理第4位,當該位置失配時,和模式串第2位匹配 ;

在第8位的a失配的時候,發現a前面存在第6位的a和模式串開頭的a匹配,第7位的d和第2位的d匹配,並且這是匹配的最大距離,所以在下一次匹配的時候,第1位的a將移到現在第6位的位置,那麼現在的第8位將變成原來的第3位;

第9位同理第8位,當該位置失配時,和模式串第4位匹配;

第10位同理第8位,當該位置失配時,和模式串第3位匹配;

那麼,當前模式串的next陣列就是:0 1 1 2 1 1 2 3 4 3

書上有個求next陣列的公式:

簡單的說:

模式串第一位的next[1]=0;

如果在第j位前面存在部分匹配長度為m,那麼next[j]=m+1;

不是前面兩種情況的話那麼next[j]=1。

反覆思考了好久才理解了,希望可以幫助到大家。

KMP演算法中怎麼求next陣列

例如 1 2 3 4 5 6 7 8 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2 next陣列的求解方法是 第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等...

KMP 演算法 next 陣列理解

可以先看一下阮一峰老師的日誌,kpm演算法 阮一峰日誌 kpm演算法有一步是求next陣列,next i 表示字串s 0.i 中最大相同前字尾的索引。比如字串abcdab,整個字串的最大相同前字尾相是ab,那麼next 5 1。function next s if s i s j 1 return ...

學習筆記 KMP演算法的Next陣列怎麼求

首先定義乙個概念 字串 不定義了。字首pre i s 1.i 字尾記為suf i s i.1 子串 略。border 如果在字串s中,存在乙個字首等於它的字尾,就稱這個字首是這個字串的乙個border。ps 不允許選擇整個串 顯然乙個字串可能有若干個border。記乙個字串中的最長的border為l...