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