串的模式匹配演算法 BF演算法詳解

2021-10-04 03:41:00 字數 1603 閱讀 1614

二、時間複雜度

三、c++實現**

bf演算法是一種蠻力演算法,其實現過程沒有任何技巧,就是簡單粗暴地拿乙個串同另乙個串中的字元一一比對,得到最終結果。

演算法目的:確定主串中所含子串第一次出現的位置,這裡的子串也稱為模式串。

(1)主串和模式串逐個字元進行比較

(2)當出現字元不匹配(失配)時,主串的比較位置重置為起始位置的下乙個字元位置,模式串的比較位置重置為起始字元

回溯關係的確定:i = i - j + 1; //主串指標回溯到比較起始位置的下乙個字元位置

關鍵字:迴圈比較

第一次回溯

因為i=j=0都是從0開始,因此逐一比較時下標相等。回溯下標需要使i=1

第二輪回溯經過第一次回溯,i的下標比j的下標大1,因此進行i=i-j+1=2,i指標又往前挪移一位

因此i-j是保留之前累積的i>j的差值,然後+1,利用迴圈便可以繼續累加,達到指標不斷向前移,回溯到比較起始位置的下乙個字元位置的效果。

(3)匹配成功返回主串中匹配串的起始位置,否則返回錯誤**

簡單理解返回位置,此時i=5為結束匹配時主串指標所指下標,j=3,為子串最後位置元素下標即子串長度,+1便表示位置而不是下標。

設主串長度為m,子串長度為n

該演算法最理想的時間複雜度 o(n),n 表示子串的長度,即第一次匹配就成功。

bf 演算法最壞情況的時間複雜度為 o(n×m),即兩個串每次匹配,都必須匹配至子串的最末尾才能判斷匹配失敗,因此執行了 n×m 次字。

在對資料量大的串進行模式匹配時,演算法的效率很低。因此bf 演算法還可以改進,就是 kmp 演算法,下次再寫文章解釋。

intbf(

const

char

* s,

const

char

* t)

else

}//j=strlen(t),說明子串遍歷完成,在主串中成功匹配

if(j ==

strlen

(t))

//跳過if執行到此,為i==strlen(b)的情況,說明已經遍歷完主串,匹配失敗

return-1

;}intmain()

如有不足之處,還望指正 1。

如果對您有幫助可以點讚、收藏、關注,將會是我最大的動力 ↩︎

BF演算法 串的模式匹配演算法

子串的定位運算通常稱為串的模式匹配或串匹配。串的模式匹配設有兩個字串s和t,設s為主串,也稱正文串 設t為子串,也稱模式。在主串s中查詢與模式t相匹配的子串,如果匹配成功,確定相匹配的子串中的第乙個字元在主串s 現的位置。著名的模式匹配演算法有bf演算法和kmp演算法,下面介紹bf演算法。模式匹配不...

BF演算法 串的模式匹配

bf演算法,即暴風 brute force 演算法,是普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串t的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和 t的第二個字元 若不相等,則比較s的第二個字元和t的第乙個字元,依次比較下去,直到得出最後的匹配結果。bf演算法是...

串的模式匹配演算法之BF演算法

演算法的基本思想是 從主串s的第pos個字元起和模式的第乙個字元比較,若相等,則繼續逐個比較後續字元 否則從主串的下乙個字元起再重新和模式的字元比較。依次類推,直至模式t中的每個字元依次和主串s中的乙個連續的字串行相等,則稱匹配成功,函式值為和模式t中的每個字元依次和主串s中的序號,否則稱匹配不成功...