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...