資源描述:
《使用KMP算法實現(xiàn)一個模式匹配》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、....課程設(shè)計——數(shù)據(jù)結(jié)構(gòu)設(shè)計題目:KMP算法實現(xiàn)一個模式匹配指導(dǎo)老師:徐浩學(xué)生姓名:孫文莉班級:信122班學(xué)習(xí)資料....學(xué)號:1290842272014年6月16日一、問題描述:使用KMP算法實現(xiàn)一個模式匹配用C/C++編寫一個程序?qū)崿F(xiàn)模式匹配的KMP算法。要求在一個字符串中搜索某個子串,若搜索到就返回子串的位置;若未搜索到,就返回0。首先要輸入個主串和模式串,先根據(jù)next()函數(shù)求模式串的next值,利用KMP算法進行匹配,再用輸出函數(shù)輸出結(jié)果!二、設(shè)計思路:該算法分為五三個模塊:第一模塊[input()函數(shù)](利用該函數(shù)輸入主串和模式串
2、的值);第二模塊[StrLength()](利用該函數(shù)求各串的長度);第三模塊[get_next()函數(shù)](利用該函數(shù)求出模式串的next函數(shù)值);第四模塊[Index_KM()函數(shù)](利用該函數(shù)進行主串和模式串之間的匹配);第五模塊[output()函數(shù)利用該函數(shù)輸出匹配結(jié)果)。個模塊之間的調(diào)用關(guān)系如下圖所示:圖4.1是對整個函數(shù)的流程圖。圖4.2是對KMP算法的流程圖;圖4.3是求next的函數(shù)值的流程圖。學(xué)習(xí)資料....因水平有限,最終程序清單與這個流程圖不同的地方,請諒解。大致思路是一致、、、學(xué)習(xí)資料....三、數(shù)據(jù)結(jié)構(gòu)定義:#define
3、MAXSIZE100;intindex_KMP(char*s,char*t,intpos);voidget_next(char*t,int*);用最簡單的數(shù)組進行KMP模式匹配主串:chars[10]="abcacbabb";模式串:chart[4]="cac";intnext[4];intpos=0;四、系統(tǒng)功能介紹:求模式串的模式值next[]函數(shù)用《模式匹配的KMP算法》當(dāng)主串和模式串匹配不相等是,模式串應(yīng)向右移動一段距離,此時我們需要得到模式串的next函數(shù)值。如何求next函數(shù),next函數(shù)值僅取決于模式本身而和主串無關(guān)。我們可以從分析n
4、ext函數(shù)的定義出發(fā)用遞推的方法求得next函數(shù)值。由定義知:next[1]=0設(shè)next[j]=k,即有:"t1t2…tk-1"="tj-k+1tj-k+2…tj-1next[j+1]=? 可能有兩種情況:一種情況:若tk=tj則表明在模式串中這就是說next[j+1]=k+1,即next[j+1]=next[j]+1第二種情況:若tk≠tj則表明在模式串中t1t2…tk"≠"tj-k+1tj-k+2…tj"此時可把求next函數(shù)值的問題看成是一個模式匹配問題,整個模式串既是主串又是模式,而當(dāng)前在匹配的過程中,已有(4.6)式成立,則當(dāng)tk≠tj
5、時應(yīng)將模式向右滑動,使得第next[k]個字符和“主串”中的第j個字符相比較。若next[k]=k′,且tk′=tj,則說明在主串中第j+1個字符之前存在一個最大長度為k′學(xué)習(xí)資料....的子串,使得"t1t2…tk′"="tj-k′+1tj-k′+2…tj"此:next[j+1]=next[k]+1同理若tk′≠tj,則將模式繼續(xù)向右滑動至使第next[k′]個字符和tj對齊,依此類推,直至tj和模式中的某個字符匹配成功或者不存在任何k′(16、ext[j+1]=0綜上所述,求next函數(shù)值過程的算法如下:voidget_next(char*t,int*next){inti=1,j=0;next[0]=next[1]=0;while(i<(int)StrLength(t)){if(j==0
7、
8、t[i]==t[j]){i++;j++;next[i]=j;}elsej=next[j];}}模式匹配KMP算法的實現(xiàn)KMP算法的思想:主串s,模式t希望某趟在si和tj匹配失敗后,指針i不回溯,模式t向右“滑動”至某個位置上,使得tk對準(zhǔn)si繼續(xù)向右進行。顯然,現(xiàn)在問題的關(guān)鍵是串t“滑動”到哪個位置
9、上?不妨設(shè)位置為k,即si和tj匹配失敗后,指針i不動,模式t向右“滑動”,使tk和si對準(zhǔn)繼續(xù)向右進行比較,要滿足這一假設(shè),就要有如下關(guān)系成立:"t1t2…tk-1"="si-k+1si-k+2…si-1"(4.1)式左邊是tk前面的k-1個字符,右邊是si前面的k-1個字符。而本趟匹配失敗是在si和tj之處,已經(jīng)得到的部分匹配結(jié)果是:"t1t2…tj-1"="si-j+1si-j+2… si-1"(4.2)因為k10、,右邊是si前面的k-1個字符,通過(4.1)和(4.3)得到關(guān)系:"t1t2…tk-1"="tj-k+1tj-k+2…t