1. 程式人生 > >KMP演算法中next和nextval陣列的計算方法

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

設字串S=aabaabaabaacP=aabaac

1.給出SPnext值和nextvai;

2.S作主串,P為模式串,試給出利用BF演算法和KMP演算法的匹配過程.

答:
1.給出SPnext值和nextvai;

失效函式採用的是清華殷人昆的資料結構上的函式。(有的人和他有點區別,本質一樣)

f(j)=k,0<=k<j,且使得p0p1p2…pk = p(j-k)p(j-k+1)…pj;f(j)=-1,其他情況。

S=”aabaabaabaac”next值為”-1,0,-1,0,1,2,3,4,5,6,7,-1”

T=”aabaac”next值為”-1,0,-1,0,1,-1”

Nextval值是對next值的一種修正,因為在pi的字元和p(f(i-1)+1)的字元相同,導致從在模式T的指標從ip(f(i-1)+1)也是一種浪費,所以在pip(f(i-1)+1)位置相同的地方,將p(i-1)f(i-1)值換成f(f(i-1)),從低位向高位計算替換。.

Snextval值為”-1,0,-1,-1,0,-1,-1,0,-1,-1,7,-1”

Tnextval值為”-1,0,-1,-1,1,-1”

2.S作主串,P為模式串,試給出利用BF演算法和KMP演算法的匹配過程.

BF

a

a

b

a

a

b

a

a

b

a

a

c

1

a

a

b

a

a

c

2

a

a

b

a

a

c

3

a

a

b

a

a

c

4

a

a

b

a

a

c

5

a

a

b

a

a

c

6

a

a

b

a

a

c

7

a

a

b

a

a

c

KMP(next)

a

a

b

a

a

b

a

a

b

a

a

c

1

a

a

b

a

a

c

2

a

a

b

a

a

c

3

a

a

b

a

a

c

此題KMP(nextval)的過程與next相同,因為沒有涉及到他們不同的失敗值。

 

相關推薦

KMP演算法nextnextval陣列計算方法

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

KMP模式匹配演算法nextnextval的求解(轉)

KMP演算法相關 轉載自:http://blog.sina.com.cn/s/blog_85b0ae450101j2iy.html KMP演算法由兩部分組成: 第一部分,計算模式串的next或nextval陣列。 第二部分,利用計算好的模式串的nextval陣列,進行模式

KMP演算法NextNextval詳解

KMP演算法是模式匹配專用演算法 它是在已知模式串的next或nextval陣列的基礎上執行的。如果不知道它們二者之一,就沒法使用KMP演算法,因此我們需要計算它們。 KMP演算法由兩部分組成: 第一部分,計算模式串的next或nextval陣列。 第二

資料結構KMP演算法課本上的next陣列nextval陣列求解方法

next陣列的求解方法是:第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前

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

KMPnextnextval演算法細節

轉自豆瓣大神總結,由於暫時還在學習階段,沒有自己的理解,還是直接搬運過來吧。 資料結構中,在串的這節,其實難度不大,關鍵是模式匹配的問題,而在模式匹配中要數KMP演算法的難度最大,而KMP的next&nextval的計算則成了學習的重中之重。面對好多學校的教程跳過不講,而教材裡的

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

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

字串匹配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陣列的求法【手算版本】 本篇只介紹next的求法和nextval的求法   例如  模式串:a b c d c a b c d s a c          next

面向考研——計算KMP演算法next陣列nextval陣列

KMP演算法中,如何手動求next陣列和nextval陣列? 首先我們要理解next陣列的意義,為了實現更加高效的字元匹配,next陣列是用來尋找字串陣列內部的自身的一種規律,利用字串內部的一種相似性,來優化字串陣列匹配演算法。所以才需要計算這麼一個next陣列來幫助演算法

【資料結構】KMP手工計算next陣列nextval陣列

KMP 演算法我們有寫好的函式幫我們計算 Next 陣列的值和 Nextval 陣列的值,但是如果是考試,那就只能自己來手算這兩個陣列了,這裡分享一下我的計算方法吧。 計算字首 Next[i] 的值: 我們令 next[0] = -1 。從 next[1] 開始,每求一個

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陣列計算方法

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

KMP演算法關於next陣列的j=next[j]理解

這篇文章是在oneNote上寫的,小弟不懂oneNote怎麼轉成md,所以只能笨辦法截圖上來了。。。覺得看的費勁的可以找我要原本 聯絡方式郵箱: [email protected]

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

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

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

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

字串匹配——KMP演算法next陣列理解

關於原理就不講了,只說下我對Next陣列的理解,希望可以讓你獲得靈光一閃。 其實最難的就是是j=Next[j];這麼一句話,當時思考了很長時間,終於明白的時候確實很興奮加得意。 #include<cstdio> #include<cstring> v

KMP模式匹配演算法next,nextval的分別實現

next陣列定義: 對於這個定義,我的理解是從1~j-1中,字首與字尾有n個相等,則next[j]=n+1。 例如:t="abcabaa" 當j=1時,next[1]=0。 當j=2時,從1~j-1,串為a,next[2]=1。 當j=3時,從1~j-1,串為ab,nex

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)