二、時間複雜度
三、c++實現**
bf演算法是一種蠻力演算法,其實現過程沒有任何技巧,就是簡單粗暴地拿乙個串同另乙個串中的字元一一比對,得到最終結果。
演算法目的:確定主串中所含子串第一次出現的位置,這裡的子串也稱為模式串。
(1)主串和模式串逐個字元進行比較(2)當出現字元不匹配(失配)時,主串的比較位置重置為起始位置的下乙個字元位置,模式串的比較位置重置為起始字元回溯關係的確定:i = i - j + 1; //主串指標回溯到比較起始位置的下乙個字元位置因此i-j是保留之前累積的i>j的差值,然後+1,利用迴圈便可以繼續累加,達到指標不斷向前移,回溯到比較起始位置的下乙個字元位置的效果。關鍵字:迴圈比較
第一次回溯
因為i=j=0都是從0開始,因此逐一比較時下標相等。回溯下標需要使i=1
第二輪回溯經過第一次回溯,i的下標比j的下標大1,因此進行i=i-j+1=2,i指標又往前挪移一位
(3)匹配成功返回主串中匹配串的起始位置,否則返回錯誤**簡單理解返回位置,此時i=5為結束匹配時主串指標所指下標,j=3,為子串最後位置元素下標即子串長度,+1便表示位置而不是下標。設主串長度為m,子串長度為n該演算法最理想的時間複雜度 o(n),n 表示子串的長度,即第一次匹配就成功。
bf 演算法最壞情況的時間複雜度為 o(n×m),即兩個串每次匹配,都必須匹配至子串的最末尾才能判斷匹配失敗,因此執行了 n×m 次字。
在對資料量大的串進行模式匹配時,演算法的效率很低。因此bf 演算法還可以改進,就是 kmp 演算法,下次再寫文章解釋。如有不足之處,還望指正 1。intbf(
const
char
* s,
const
char
* t)
else
}//j=strlen(t),說明子串遍歷完成,在主串中成功匹配
if(j ==
strlen
(t))
//跳過if執行到此,為i==strlen(b)的情況,說明已經遍歷完主串,匹配失敗
return-1
;}intmain()
如果對您有幫助可以點讚、收藏、關注,將會是我最大的動力 ↩︎
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中的序號,否則稱匹配不成功...