導航:首頁 > 源碼編譯 > kmp演算法nextval

kmp演算法nextval

發布時間:2022-03-12 13:38:10

❶ KMP演算法中的nextval函數值的原理,求詳細推導

1 get_nextval(int *nextval,const char *string)
2 {
3 int num=strlen(string);
4 int i=0,j=-1;
5 nextval[0]=-1;
6 while(i<num)
7 {
8 if(j==-1||string[i]=string[j])
9 {
10 i++;
11 j++;
12 if(string[i]==string[j])
13 {
14 nextval[i]=nextval[j];
15 }
16 else
17 {
18 nextval[i]=j;
19 }
20 }
21 else
22 {
23 j=next[j];
24 }
25 }
kmp的思想主要是通過nextval數組來指示「假如在子串與主串匹配過程中在某一位(假設為 j )匹配失敗(不相等)時,子串應回到的位置。」以此區別於樸素模式匹配的一旦在某位匹配失敗,就從頭比較的特點。所以在生成與子串等長的nextval數組時,nextval數組每一個元素標識的就應該是當在子串的第j位與主串匹配失敗時,應回到子串的哪一位。
設子串string為"abqabc"。主串為"abqabqabc";生成nextval的思想是:假設目前 j 和 i 各處string的某一個位置,對比string[j]和string[i](代碼第8行),若相等,j 和 i 都向前一步,j , i 向前一步(代碼10~11行)是為了下一次匹配,同時是為了在nextval[i]記錄當子串與主串匹配失敗時應回到子串的哪一位繼續比較下去(代碼第14或18行)。比如說當子串與主串在第六位(子串的c跟主串的q)匹配失敗時,我們會希望nextval[5]記錄的是2,這樣"ab"就不需重新匹配。
可以看到在子串的 c 之前,"abqab" 是前綴(ab)與後綴(ab)相等的,有兩位,所以在nextval[5]記錄 2 ,意思就是當 c 與主串匹配失敗時,直接回到子串string[2]繼續比較即可。
在製作nextval數組的過程中,i只會往前,j如果遇到前綴string[j]不等於後綴string[i]時會回溯,往回找,看能不能找到與後綴相等的前綴。比如子串為"abqabac",製作nextval數組時比較到第三位(q)跟第六位(a)時,此時q不等於a,所以j往回找,拿第二位(b)跟第六位(a)比較,還是不相等,繼續往回找,找到一個位(a)跟第六位(a),相等,則在nextval[5]記錄nextval[0]的值,即-1,這時如果子串跟主串的匹配在子串的第六位(a)匹配失敗了,則直接略過主串的這一位,子串從頭開始與主串的下一位繼續進行匹配。

❷ C語言中nextval什麼意思

C程序連接資料庫了?
SQL可以用nextval函數訪問SEQUENCE的值

❸ 數據結構kmp 優化演算法中的nextmal 值的求法

aeth

❹ 串模式匹配的kmp演算法中next[0]的值到底是0還是-1;next[1]的值又到底是1還是0

因為找next值的時候是從第一個字元開始的,規定第一個字元的next值為0,即如果第一個字元的下標為0則next[0]=0,如果第一個字元的下標是1則next[1]=0。。。因為next值將作為主串的標,數組下標不能為負數,所以next[0]不能為-1。。。

❺ 數據結構nextval值怎麼求

KMP演算法優化,將next[j]修正為next [next[j]],直至兩者不相等為止,更新後的數組命名為nextval。
一般手算時,從前往後,找相同字元更新即可。

❻ KMP演算法中模式串的next[j](優化版,無返回值)(也就是修正值的那個) 求大佬按下面的結構體給寫出演算法

用nextval[]改進next[]

還有,代碼真美,看了好久

 

#include<stdio.h>

#define MAXSIZE 100

#include<iostream>

using namespace std;

typedef struct

{

char data[MAXSIZE];

int length;

}SqString;

void StrAssign(SqString &s,char cstr[])

{

int i;

for(i=0;cstr[i]!='\0';i++)

s.data[i]=cstr[i];

s.length=i;

}

void GetNextval(SqString t,int nextval[])

{

int j=0,k=-1;

nextval[0]=-1;

while(j<t.length)

{

if(k==-1||t.data[j]==t.data[k])

{

j++;

k++;

if(t.data[j]!=t.data[k])

{

nextval[j]=k;

}else

nextval[j]=nextval[k];

}

else

k=nextval[k];

}

}

int KMPIndex1(SqString s,SqString t)

{

int nextval[MAXSIZE],i=0,j=0;

GetNextval(t,nextval);

while(i<s.length&&j<t.length)

{

if(j==-1||s.data[i]==t.data[j])

{

i++;

j++;

}

else

j=nextval[j];

}

if(j>=t.length)

return (i-t.length);

else return -1;

}

int main()

{

SqString t,p;

StrAssign(t,"aaadaaadaaaad");

StrAssign(p,"aaaad");

cout<<KMPIndex1(t,p)<<endl;

}

❼ 求next數組和nextval數組。

next : 前綴和後綴的最長匹配數 + 1;
nextval: 第 i 個字元 (i 的下標從 1開始)若與 第next[i] 上的字元不同,nextval[i]保持為 next[i] ,否則 更新為 第next[i]上的nextval值(也就是 nextval[next[i]])。(不同保持不變,相同則替換)

❽ 數據結構kmp演算法中的next函數

我只曉得next
我想你還是不太了解KMP(其實我也不算很懂,盡量說吧O(∩_∩)O~交流下)
那個next其實是T串(字串)自己和自己匹配所得到的。
方法和S T匹配時一樣,主不過以前是遇到不匹配時回到NEXT【j】,這個函數中則是遇到不匹配記錄下不匹配的位置(說明前面得j個是後面串的後綴)。
至於您說的那個
tvalnext
我不清楚,你能發過來么?一起學習下。O(∩_∩)O~

❾ 求大神給一個KMP演算法,C語言的

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void get_nextval(char const * ptn,int * nextval)
{
int i=0;
nextval[0]=-1;
int j=-1;
int plen=strlen(ptn);
if(ptn==NULL||nextval==NULL)
{
return;
}
while(i<plen)
{
if(j==-1||ptn[i]==ptn[j])
{
++i;
++j;
if(ptn[i]!=ptn[j])
{
nextval[i]=j;
}
else
{
nextval[i]=nextval[j];
}
}
else
{
j=nextval[j];
}
}
}
int kmp_search(char const * src,char const * patn,int const * nextval,int pos)
{
int i=pos;
int j=0;
if(src==NULL||patn==NULL)
{
return -1;
}
int slen=strlen(src);
int plen=strlen(patn);
if(pos<0||pos>slen)
{
return -1;
}
while(i<slen && j<plen)
{
if(j==-1||src[i]==patn[j])
{
++i;
++j;
}
else
{
j=nextval[j];
}
}
if(j>=plen)
{
return i-plen;
}
else
{
return -1;
}
}
int main()
{
char src[]="";
char prn[]="abce";
int * nextval=(int *)malloc(sizeof(int)* strlen(prn));
get_nextval(prn,nextval);
int i=0;
for(i=0;i< strlen(prn);i++)
{
printf("%d",nextval[i]);
}
printf("\n");
printf("the result is:%d\n",kmp_search(src,prn,nextval,5));
return 0;
}
望採納哦~~O(∩_∩)O~

❿ 請問數據結構的KMP演算法這個是什麼算出來的

http://blog.csdn.net/ts173383201/article/details/7850120
這里有一篇關於KMP演算法不錯的分析,我以前收藏的。你可以參考下看看,圖文並茂,說明很詳細。
希望對你有所幫助。

閱讀全文

與kmp演算法nextval相關的資料

熱點內容
app的數據越來越大是什麼 瀏覽:198
反編譯步驟意思 瀏覽:642
ug編程怎麼加刀補 瀏覽:623
奶片檢驗指標源碼 瀏覽:590
中國程序員top10 瀏覽:306
iphone上的app怎麼登錄 瀏覽:944
在家很無聊用什麼app 瀏覽:37
安卓介面如何更換 瀏覽:400
雲音樂程序員上線功能 瀏覽:43
小天才手錶如何查看app的使用時長 瀏覽:606
編譯器多久能寫一個 瀏覽:648
過磅怎麼演算法錢 瀏覽:873
同一款手機備份文件夾可以互用嗎 瀏覽:868
matlab圖像處理pdf 瀏覽:66
學python3最好的書 瀏覽:772
maven下載依賴的命令 瀏覽:93
二分查找流程圖演算法 瀏覽:689
質量問題的演算法 瀏覽:85
c代碼編譯吃cpu頻率還是核心 瀏覽:173
pdf簽名adobe 瀏覽:406