KMP演算法中next陣列的計算

2021-08-20 14:37:13 字數 2760 閱讀 6612

getnext的個人理解:

首先先說一下next串的定義吧:

在對於字串t中每個字元

t[j](0<=j<=len-1)

,存在乙個整數

k(k使得模式串t中

開頭的k個字元依次與

t[j]

的前面的

k個字元相同。

#include"順序串.cpp"//關於順序串的基本操作,下邊放有源**

void getnext(sqstring t,int next)//求字串t的next陣列

int main()

sqstring;

void strassign(sqstring &str,char cstr)//將乙個字串常量賦給串str,即生成乙個其值等於cstr的串s。

void strcopy(sqstring &s,sqstring t) //將串t複製給串s

sqstring substr(sqstring s,int i,int j)//返回串s中從第i(1≤i≤strlength(s))個字元開始的、由連續j個字元組成的子串。

for (k=i-1; kstr*/

str.data[k-i+1]=s.data[k];

str.len=j;

return str;

}sqstring insstr(sqstring s1,int i,sqstring s2)//將串s2插入到串s1的第i個字元中,即將s2的第乙個字元作為s1的第i個字元,並返回產生的新串

for (j=0; jstr*/

str.data[j]=s1.data[j];

for(j=0; jstr*/

str.data[i+j-1]=s2.data[j];

for (j=i-1; jstr*/

str.data[s2.len+j]=s1.data[j];

str.len=s1.len+s2.len;

return str;

}sqstring delstr(sqstring s,int i,int j)//從串s中刪去第i(1≤i≤strlength(s))個字元開始的長度為j的子串,並返回產生的新串。

for (k=0; kstr*/

str.data[k]=s.data[k];

for(k=i+j-1; kstr*/

str.data[k-j]=s.data[k];

str.len=s.len-j;

return str;

}sqstring repstr(sqstring s,int i,int j,sqstring t)//在串s中,將第i(1≤i≤strlength(s))個字元開始的j個字元構成的子串用串t替換,並返回產生的新串

for (k=0; kstr*/

str.data[k]=s.data[k];

for (k=0; kstr*/

str.data[i+k-1]=t.data[k];

for(k=i+j-1; kstr*/

str.data[t.len+k-j]=s.data[k];

str.len=s.len-j+t.len;

return str;

}void dispstr(sqstring s)//輸出串s的所有元素值

所相等的)

每乙個t的

next

值都是與前一位的儲存相關聯,所以要與前一位的

t[k]

的字元進行比較。

if相等:

則j++,k++;

next[j]=k;

j++(因為

next

中位置的資料資訊儲存在

j+1的位置上

)k++(因為比較字元相同,所以只需要在前者的k上

+1即可

)else不相等:

k回退找到0~k個字元「大串中」,找到已經匹配好的「小串」,若找到與

t[j]

相等的字元,

則把「當前」的k+1

存入。若找不到,則此時的

k一定回溯到了

k=(-1);k++

,j++

;此時t[j]的

next

為next[j+1]=-1+1=0;

正好為0

,沒有相同的字串。

由此也就解釋了為何要將next[0]=-1。(可能有疑惑為什麼小串的數值一定是匹配好的。::因為小串是在大串中的,而我們找的大串就是匹配好的大串,所以小串數值一定也是匹配好的)

(emmmm:當找不到相同的字元時,

k=-1

;k++,j++

;k=0

,正好符合

0個字元與開頭字元相同。儲存在

next[j+1]

中,即next[j+1]=0為j

的資料資訊)

nextval優化的特點就是將失配的字元於此時next的值下的字元進行比較,若想等則直接遞推,即nextval[j]=nextval[k];因為這兩個字串是相等的再與主串匹配時同樣會失配。(當不相等時,則與next的賦值一樣,另nextval[j]=k);例如a=c,c=c1,所以a=c1.所以相等時可直接跳過一次不必要的回溯,此優化是在next中進行的優化,優化結果為新的陣列nextval.

在這裡我提供一種方便記憶的方法:1) t[j]!=t[k],nextval[j]=next[j];

2) t[j]==t[k],nextval[j]=nextval[k];

即:不相等,不變。相等,繼承。

時間關係沒有細寫,我會再次完善本篇文章。

KMP演算法中的next 陣列

kmp演算法最難懂的就是next陣列的求法。位置i01 2345 6789 1011 1213 1415 字首next i 00 0012 3123 4567 40子串a gcta gcag ctag ctg 申明一下 下面說的對稱不是中心對稱,而是中心字元塊對稱,比如不是abccba,而是abca...

KMP演算法next計算

kmp演算法是在最近這兩年的軟體設計師考試中才出現的。2次都是讓求next函式的序列 其實是 先看看題吧。2011年下半年上午題 2012年上半年上午題 其實做這個題很簡單,我先說說這個題裡的各種概念。給定的字串叫做模式串t。j表示next函式的引數,其值是從1到n。而k則表示一種情況下的next函...

關於KMP中next陣列的計算

目標字串 abcdefgh 模式字串 abcab模式字串 abcab例子 abcab的next陣列計算方法下標0 1234 模式字串ab cabnext陣列01 112 1.下標為 0 的初值這裡設定為 0 2.下標為 1 的初值這裡設定為 1 3.下標為 2 的初值的計算步驟 1 這裡假設 i 2...