C 資料結構之KMP演算法 詳解

2021-10-09 06:24:01 字數 1991 閱讀 5126

kmp演算法是一種匹配演算法,用來進行匹配查詢。

通過在子串的每一位都設定乙個與之對應的回溯陣列下標,降低演算法的時間複雜度。

每乙個需要查詢的子串,該演算法都會給它生成乙個與之相對於的next陣列,用來進行回溯。

假設需要查詢的子串為:string s=「aaababa」//該串首位也用來存放資料

生成的next陣列為0012010//代表陣列下標

假如陣列是匹配到了s[3]才出現匹配失敗,這代表前面的s[0],s[1],s[2]都匹配成功了。s[0],s[1]和s[1],s[2]是一樣的,都是aa,所以現在主串只需要和s[2]進行匹配。

設定子串的next陣列的時候,只需要看該數字前面的資料,頭和尾一樣的資料有多少,回溯的位置就是一樣的資料段中串頭資料段的下一位!

子串ababc,那麼next[4]=2;因為c前面的串頭ab和串為ab一樣,所以只需從一樣的前面部分的下一位開始匹配。

子串ababac,那麼next[5]=3,因為c前面串頭aba和串為aba一樣,同理即可!

子串aab,next[1]=0;next[2]=1;前面是因為沒有形成串頭串尾,後面的同理即可!

(中間的元素可重複利用,但是子串的串頭和串尾不能是同乙個元素)

假如子串為s;主串為t。子串與主串進行匹配的時候,如果主串t[j]匹配到了子串s[i]出現匹配失敗,那麼子串的陣列下標i=next[i],然後繼續和t[j]進行匹配,一直重複,直到匹配成功或者匹配到了子串的第乙個資料依然不相等,則令主串的陣列下標指向自增(j++),也就是主串的下乙個元素繼續和子串進行匹配,一直重複直到找到該子串或者主串結束。

#include

using

namespace std;

intgetnext

(string s,

int* next)

/獲取next陣列

else

}else

}return0;

}int

search

(string t, string s,

int pos)

//t是主串,s是匹配串,pos是開始匹配的位置

else}if

(i >

(s[0]-

48))//此時t[j]指的是主串剛匹配完最後乙個子串資料的下乙個單位

else

}int

main()

else

return0;

}

#include

using

namespace std;

intgetnext

(string s,

int*next)

//獲取next陣列

else

if(i ==

0&& s[i]

!= s[j]

)//i一直回溯到第乙個還是和s[j]不一樣,那麼設定next[j]就為i,並且j自增,開始設定下乙個值的回溯值

else

//如果上面兩個條件都沒進入,代表既不相等,也還沒到第乙個匹配值,繼續往前回溯

}return0;

}int

search

(string t, string s,

int pos)

//t是主串,s是匹配串,pos是開始匹配的位置

else

if(i ==

0&& t[j]

!= s[i]

)//如果匹配到s[0]還匹配不成功的話,主串就指向下乙個元素

else

//如果上面的判斷都沒進入,子串就繼續往前回溯}if

(i > s.

size()

)//此時t[j]指的是主串剛匹配完最後乙個子串資料的下乙個單位

else

}int

main()

return0;

}

資料結構之KMP演算法

當j 1時,next j 0 其他情況,next j 1 next j max t的長度時m,時間複雜度為o m while迴圈的時間複雜度為o n 整個演算法的時間複雜度為o n m 樸素模式時間複雜度為o n m 1 m kmp演算法僅當模式與主串部分匹配時,才能展現其優勢。求模式串t的next...

資料結構kmp演算法應用(c )

題目描述 根據kmp演算法的next陣列值,推斷模式字串。假設模式字串中只存在0,1兩種字元。給出首字元和next陣列。請輸出模式字串。如果next陣列不合法則輸出error input format 先輸入模式字串首字元0或者1,然後輸入尾字元0或者1 再輸入 模式字串長度n,n 30 最後輸入n...

資料結構 KMP演算法

求串的模式值next n 定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元相同,且 j的前面的 1 k個字元與開頭的 1 k個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6...