1. 程式人生 > >最簡單的KMP演算法求next陣列值的方法

最簡單的KMP演算法求next陣列值的方法

本文依照嚴蔚敏串的資料結構(C語言版本)總結的方法:

next陣列的求解方法是:

注意:1.   j的下標識從0開始排的

                2.  規定next[0]=-1,next[1]=0

                  
j              0  1  2  3  4  5  6  7 

P             a  b  a  a  b  c  a  c

next       -1  0  ?

next[0],next[1]前兩個直接寫;

求next[j=2],則先將P[2-1]=b和P[next[2-1]]=P[0]=a比較,不相等,則向前,P[next[2-2]]=P[-1],因為到達-1,所以next[j]=0。

j              0  1  2  3  4  5  6  7 

P             a  b  a  a  b  c  a  c

next       -1  0  0  ?

求next[j=3],先將P[3-1]=a和P[next[3-1]]=P[0]=a比較,相等,則next[3]=0+1=1

j              0  1  2  3  4  5  6  7 

P             a  b  a  a  b  c  a  c

next       -1  0  0  1  ?

法1:求next[j=4],先將P[4-1]=a和P[next[4-1]]=P[1]=b比較,不相等,則向前,P[next[4-2]]=P[0]=a=P[4-1],所以next[4]=next[4-2]+1=0+1=1。

法2:求next[j=4],先將P[4-1]=a和P[next[4-1]]=P[1]=b比較,不相等,此時記住p[next[4-1]]=P[1]=a的next的陣列的值0,即next[p[1]]=0,比較P[4-1]=a與P[1]=b,不相等,此時記住P[1]的next陣列的下標0,比較P[4--1]=a與P[0]=a,不相等,但時此時P[0]的下標為-1,比較結束,直接將P[4]的next值寫為0;

j              0  1  2  3  4  5  6  7 

P             a  b  a  a  b  c  a  c

next       -1  0  0  1  1  ?

求next[5],先將P[5-1]=b和P[next[5-1]]=b比較,相同,則next[5]=next[5-1]+1=2。

j            0  1  2  3  4  5   6  7 

P           a  b  a  a  b  c  a  c

next     -1  0  0  1  1   2  ?

求next[6],先將P[6-1]=c和P[next[6-1]]=a比較,不相同,則向前,比較P[6-1]=c和P[next[6-2]]=b不相同,再比較P[6-1]=c和P[next[6-3]]=b不相同,再比較P[6-1]=c和P[next[6-4]]=a不相同,再比較P[6-1]=c和P[next[6-5]]=a不相同,再比較P[6-1]=c和P[next[6-6]]=P[-1]結束比較,next[6]=0.

j              0  1  2  3  4  5   6  7 

P             a  b  a  a  b  c  a  c

next       -1  0  0  1  1   2  0  ?

求next[7],先將P[7-1]=a和P[next[7-1]]=a相同,所以next[7]=next[7-1]+1=0+1=1.

next陣列求值完畢。

j              0  1  2  3  4  5   6  7 

P             a  b  a  a  b  c  a  c

next       -1  0  0  1  1   2  0  1

相關推薦

簡單KMP演算法next陣列方法

本文依照嚴蔚敏串的資料結構(C語言版本)總結的方法: next陣列的求解方法是: 注意:1.   j的下標識從0開始排的                 2.  規定next[0]=-1,next[1]=0                   j           

kmp演算法 關於next陣列的詳細解釋

前言     之前對kmp演算法雖然瞭解它的原理,即求出P0···Pi的最大相同前後綴長度k;但是問題在於如何求出這個最大前後綴長度呢?我覺得網上很多帖子都說的不是很清楚,總感覺沒有把那層紙戳破,後來翻看演算法導論,32章 字串匹配雖然講到了對前後綴計算的正確性,但

KMP演算法next陣列與字首中的週期(相關題目:Power strings, poj2406)

在一個大的字串S中查詢字串T,naive的演算法時間複雜度為O(s * t)(這裡s與t代表S的長度與T的長度);而應用KMP,時間複雜度為O(s + t)。 KMP演算法的核心在於next陣列。next陣列只與字串T有關,與S無關。 next陣列的核心思想是儲存字串T

KMP演算法next陣列、nextval陣列的手工計算

剛接觸資料結構,對於其中的一些演算法都不是很瞭解,這幾天剛在學習串的內容,裡面介紹了兩種串的模式匹配演算法,一種是BF演算法(也叫做BoyFriend演算法);另一種是KMP演算法(也叫做“看毛片”演算法)。BF演算法的實現很簡單,很暴力,但是在時間複雜度的限制下,這不是一個

關於KMP演算法next陣列和nextVal陣列求法的整理

例如: 序號 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值時,根據前一位進行比較。

KMP演算法next陣列詳解

    最近整理筆記時,突然翻出幾年前理解起來困難無比的看毛片(KMP)演算法,筆記中詳述了搜尋過程,圖文並茂,然而在最最重要的next陣列部分卻是一帶而過,於是找出當年的教材,也只是寫了getnext()函式,想著上網找一找圖文並茂的舉例,結果這一找徹底蒙比,眾說紛紜,同

字串匹配KMP演算法Next[]陣列求法

int get_nextval(SString T,int &nextval[ ]){            //求模式串T的next函式修正值並存入陣列nextval。            i=1; nextval[1]=0; j=0;            while(i<T[0]){

KMP演算法next陣列的手工計算方法

筆試題目中經常要求計算KMP演算法的next陣列,網上有很多討論的文章,但是感覺都講的不太清楚,特別是在如何手工計算這一方面,所以今天特別整理了一下放到這裡,一來備忘,二來也希望給有緣人帶來一些方便。 位置編號 1 2 3 4 5

關於kmp演算法next陣列的求法【針對手算的】

 關於kmp演算法中next陣列的求法【手算版本】 本篇只介紹next的求法和nextval的求法   例如  模式串:a b c d c a b c d s a c          next

KMP演算法簡單next陣列

前言 1.next陣列的計算只與模式串有關,與主串無關 2.next可能有不同的表示方法,但意義不變 3.字首:除最後一個字母外,前面字母的從前往後組合情況。串abaaba的字首={a,ab,aba,abaa,abaab} 4.字尾:除第一個字母外,後面字母的從前往後組合情況。串

演算法 陣列大和 C

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

演算法 - 陣列大和(C++)

  //**************************************************************************************************** // // 求子陣列的最大和 - C++ - by Chimomo // //

演算法 陣列大和 C

                //****************************************************************************************************////  求子陣列的最大和 - C++ - by Chimomo////

KMP演算法NEXT陣列計算方法

KMP演算法: 關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現一個next()函式,函式本身包含了模式串的區域性匹配資訊。時間複雜度O(m+n)。

KMP演算法next和nextval陣列的計算方法

設字串S=’aabaabaabaac’P=’aabaac’ 1.給出S和P的next值和nextvai值; 2.若S作主串,P為模式串,試給出利用BF演算法和KMP演算法的匹配過程. 答:1.給出S和P的next值和nextvai值; 失效函式採用的是清華殷人昆的資料結構上的

KMP演算法next陣列計算方法的優化

KMP演算法的原理就是利用相匹配的字首子串與字尾子串,來確定失配時下次對齊的位置; 其中最關鍵的就是next陣列的確立; 資料結構課本上KMP演算法next陣列計算經典的例子: void getNext(const char *pStr, int *nextArr) {

比較好懂的KMP演算法解釋(附next陣列求解方法

字串匹配是計算機的基本任務之一。   舉例來說,有一個字串"BBC ABCDAB ABCDABCDABDE",我想知道,裡面是否包含另一個字串"ABCDABD"?   許多演算法可以完成這個任務,Knuth-Morris-Pratt演算法(簡稱KMP)是最常用的之一。它以

Kmpnext(下標從0開始的)

直接上程式碼: #include<iostream> #include<cstring> #include<cstdio> using namespace std

KMP演算法nextnext value陣列的手工計算

    昨天下午在書上看到了KMP演算法,看了很多很多很多遍都搞不懂什麼邏輯和原理;今天上午又聽了學長講了一遍感覺沒大聽懂,自己又上網找了很多相關文章,試了很多例子,終於找出來KMP演算法中手工計算

KMP演算法next函式解釋(大量的反證法 和數學歸納法來襲)

先放get_nextval()函式的程式碼 void get_nextval(const char str[],int *net) { net[0]=-1; int j=0,k=-1,len; len=strlen(str); while(j<len)