日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言数据结构kmp中next计算,数据结构——关于KMP算法中next函数的详细解析

發布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言数据结构kmp中next计算,数据结构——关于KMP算法中next函数的详细解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以前看到數據結構中字符串的模式匹配時,花了半天的時間,才把KMP算法中的next函數整明白了,結果過了幾天在看到這時,只記得next[j+1]=next[j]+1,但是有時候能套公式正確算出,有時候就算不對,因此今天再從新理一遍思路,順便記錄下來,防止哪天腦子再短路了,又不知道怎么求解的了。算法

先看看next數據值的求解方法

位序 ? ? ? 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9

模式串 ? ? a ? b ? a ? a ? b ? c ? a ? b ? c

next值 ? ? 0 ? 1 ? 1 ? 2 ? 2 ? 3 ? 1 ? 2 ? 3

next數組的求解方法是:

1.第一位的next值為0

2.第二位的next值為1

后面求解每一位的next值時,根據前一位進行比較

3.第三位的next值:第二位的模式串為b ,對應的next值為1;將第二位的模式串b與第一位的模式串a進行比較,不相等;則第三位的next值為1(其余狀況均為1)

4.第四位的next值:第三位的模式串為a ,對應的next值為1;將第三位的模式串a與第一位的模式串a進行比較,相同,則第四位的next值得為1+1=2

5.第五位的next值:第四位的模式串為a,對應的next值為2;將第四位的模式串a與第二位的模式串b進行比較,不相等;第二位的b對應的next值為1,則將第四位的模式串a與第一位的模式串a進行比較,相同,則第五位的next的值為1+1=2

6.第六位的next值:第五位的模式串為b,對應的next值為2;將第五位的模式串b與第二位的模式中b進行比較,相同,則第六位的next值為2+1=3

7.第七位的next值:第六位的模式串為c,對應的next值為3;將第六位的模式串c與第三位的模式串a進行比較,不相等;第三位的a對應的next值為1,

則將第六位的模式串c與第一位的模式串a進行比較,不相同,則第七位的next值為1(其余狀況)

8.第八位的next值:第七位的模式串為a,對應的next值為1;將第七位的模式串a與第一位的模式串a進行比較,相同,則第八位的next值為1+1=2

9.第八位的next值:第八位的模式串為b,對應的next值為2;將第八位的模式串b與第二位的模式串b進行比較,相同,則第九位的next值為2+1=3

若是位數更多,依次類推

KMP算法的關鍵在于求算next[]數組的值,即求算模式串每一個位置處的最長后綴與前綴相同的長度,下面按照遞推的思想總結一下求解next[]數組:

根據定義next[1]=0,假設next[j]=k, 即P[1...k-1]==P[j-k,j-1]數組

1)若P[j]==P[k],則有P[1..k]==P[j-k,j],很顯然,若是next[j]=k; 則next[j+1]=next[j]+1=k+1;不然next[j+1]=k+1!=next[j]+1;(當初就想著記公式簡單能夠直接套用呢,結果只記住next[j+1]=next[j]+1以致于后來迷糊了)

2)若P[j]!=P[k],則能夠把其看作模式匹配的問題,即匹配失敗的時候,k值如何移動,顯然k=next[k]。

所以能夠這樣去實現:數據結構

void getNext(char *p,int *next)

{

int j,k;

next[1]=0;

j=1;

k=0;

while(j

{

if(k==0||p[j]==p[k]) //匹配的狀況下,p[j]==p[k],next[j+1]=k+1;

{

j++;

k++;

next[j]=k;

}

else //p[j]!=p[k],k=next[k]

k=next[k];

}

}

KMP模式匹配算法改進:函數

后來有人發現其實KMP算法仍是有缺陷的,好比主串S=“aaaabcde”,子串T=“aaaaag”,其next數組為012345;當i=5 ,j=5是“b”與“a”不匹配,此時j=next[5]=4,又發現j=4時,“b”與“a”不匹配,依次類推,直到j=next[1]=0;此時i++,j++,i=6,j=1從而咱們發現中間有多余的判斷,因為子串T中第二、三、四、5位置的字符都與首位的“a”相同,便可以用首位next[1]的值去取代與它字符相等的后續next[j]的值,即next數組改成000005,此時由i=5,j=5時“b”與“a”不匹配,此時j=next[5]=0;此時i++,j++獲得i=6,j=1,便可省去中間的多余判斷。所以咱們須要改進next函數的求解方法。spa

/* 求模式串T的next函數修正值并存入數組nextval */

void get_nextval(String T, int *nextval)

{

int i,j;

i=1;

j=0;

nextval[1]=0;

while (i

{

if(j==0 || T[i]== T[j]) /* T[i]表示后綴的單個字符,T[j]表示前綴的單個字符 */

{

++i;

++j;

if (T[i]!=T[j]) /* 若當前字符與前綴字符不一樣 */

nextval[i] = j;/* 則當前的j為nextval在i位置的值 */

else

nextval[i] = nextval[j];/* 若是與前綴字符相同,則將前綴字符的 */

/* nextval值賦值給nextval在i位置的值 */

}

else

j= nextval[j];/* 若字符不相同,則j值回溯 */

}

}

總結

以上是生活随笔為你收集整理的c语言数据结构kmp中next计算,数据结构——关于KMP算法中next函数的详细解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。