串的模式匹配演算法(BF和KMP)

2021-09-11 07:01:52 字數 1642 閱讀 4881

子串的定位操作通常稱作串的模式匹配,關於串的模式匹配演算法主要介紹兩種:1.brute-force簡稱為bf演算法,也稱簡單匹配演算法,在給出的字串中尋找和需要匹配的字串相同的部分,為了簡潔就稱給出的長字串為目標串,需要匹配的字串為模式串。用bf演算法進行匹配的時候,同時從目標串和模式串開始,如果第乙個字元相同就接著比較下乙個字元,如果下乙個字元不同,則目標串回退到第二個字元,模式串回退到第乙個字元,重新開始匹配,依次類推,如果遇到和模式串相同的子串,則匹配成功,如果直到目標串結束還沒有找到和模式串相同的子串,則匹配失敗。

運用bf演算法進行匹配的時候,一旦碰到不同的就要回退,而且回退的距離很大,目標串回退到一開始比較的下乙個字元,模式串回退到第乙個字元,重新比較。

2.第二種方法就是kmp演算法。

kmp演算法是d.e.knuth、j.h.morris和v.r.pratt共同提出的,簡稱kmp演算法。該演算法較bf演算法有較大改進,主要是消除了目標串指標的回溯,因此在遇到不匹配的情況時,目標串指標不需要回退,只需要模式串的指標回退即可。從而使演算法效率有了提高。

kmp演算法在匹配的時候,也是從目標串和模式串的開頭進行比較,逐次向後比較直到遇到不相等的情況,這時目標串的指標不回退,而是模式串的指標回退,回退的多少取決於不匹配的這個字元的緊鄰的前面最多有多少個字元與開頭的字元是相同的,既然緊鄰的字元與開頭的字元相同,而到這個不相同的字元為止,前面緊鄰的字元與目標串的都匹配,那麼開頭的幾個字元與目標串的也一定匹配。因此模式串的指標只需要回退到模式串開頭的跟緊鄰的字元相同的字元的最後乙個的下乙個即可。如:目標串:abacabaa模式串:abab在匹配的時候模式串aba與目標串的aba都匹配得上,到了目標串的第四個字元c與模式串不匹配,因此目標串的指標不動,模式串的指標需要回退,又直到在模式串中,b與目標串不匹配,b前面是a,a正好與模式串開頭的a相同,因此,模式串的指標只需要回退到開頭的a的下乙個字元b即可。(由於不匹配的b前面的a已經與目標串比較過了,a是匹配的,那麼開頭的也是a,當然與目標串也匹配,所以找a的下乙個就可以了),再比如:目標串abcabds模式串abcabc,匹配的時候到了模式串的c與目標串的d不匹配,模式串前面的ab與開頭的ab相同,因此模式串的指標只需要回退到開頭ab的下乙個字元即可。

說完了回退的過程,但重點還是找回退多少,找回退的多少可以用next陣列。next陣列負責找在這個字元的前面最多有多少個字元與開頭的字元相同,即找如果不匹配時指標應該回退的多少。也就是在模式串中需重新和主串中該字元進行比較的字元的位置。

關於next陣列:next[j]=(1)當j=1時,即第乙個字元,next[j]=0;(2)當j不為1時,找這個字元前面最多有多少字元與開頭的字元相同,next[j]的值為最多相同的字元數目加1。如果這個字元前面沒有與開頭的字元相同的,則next[j]=1。這是自己算的時候一般用的方法。在用程式語言實現時需要用next函式。關於如何求next函式值,簡單介紹一下,到時候還要看具體情況(一般陣列從0開始,next[0]=-1比較多)。假設next[j] = k,則next[j+1] =?分情況:(1)若pk=pj,則有「p1…pk-1pk」=「pj-k+1…pj-1pj」 時,next[j+1] = k+1 = next[j]+1;(2)若pk≠pj,可把求next值問題看成是乙個模式匹配問題,整個模式串既是主串,又是子串。即求在緊鄰j+1這個字元之前有多少個字元與開頭的字元相同。讓j回退,類似於模式匹配,直到j回退到與j+1這個字元相等的位置設為k』為止(即j=next[j]),這時next[j+1]=k』+1。

串模式匹配之BF和KMP演算法

本文簡要談一下串的模式匹配。主要闡述bf演算法和kmp演算法。力求講的清楚又簡潔。一 bf演算法 核心思想是 對於主串s和模式串t,長度令為len1,len2,依次遍歷主串s,即第一次從位置0開始len2個字元是否與t對應的字元相等,如果完全相等,匹配成功 否則,從下個位置1開始,再次比較從1開始l...

字串模式匹配(BF演算法和KMP演算法)

字串模式匹配 在主串s中尋找子串t,若主串第i個下標開始的字串同子串t完全相同,則返回下標i,若遍歷完主串s未找到匹配,則返回 1。bf brute force 演算法 bf演算法的思想就是將目標串s的第乙個字元與模式串t的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和 t的第二個字元 若不...

模式匹配之BF演算法和KMP演算法

兩種演算法主要差別就是指標回溯的位置,kmp演算法去除了bf演算法中很多重複的比較 define crt secure no warnings include include include 使用陣列下標的方式比較,如果找到返回子串在主串中的位置,沒找到返回 1 intbf const char s...