BF演算法與KMP演算法

2021-10-08 08:47:59 字數 1255 閱讀 7075

bf演算法與kmp演算法都是用來查詢主串中子串的位置,也就是模式匹配。

bf演算法的簡單粗暴,缺點是每趟匹配不成功時,存在大量回溯,導致程式效率低下,而kmp演算法充分利用了成功匹配部分的結果,保證了主串游標不回溯,通過模式串向右滑動代替模式串游標回溯,大大提高了程式執行效率。

簡單的了解了一下bf和kmp演算法的作用和優缺點後,我們先來看一下具體的**和細節

先看bf演算法(這個演算法比較簡單,就不多說了直接上**)

#include

#include

using namespace std;

intbf

(char s,

char t)

if(j==len2)

return i-j+1;

}return-1

;}intmain()

關於kmp演算法,主要的難點在於next陣列的計算

在這之前,我們已經知道了主串指標i可以不回溯,模式串向右滑動到新的比較起點k,並且k僅與模式串t有關,

那麼如何由當前部分匹配結果確定模式向右滑動的新比較起點k?

模式應該向右滑動多遠才是效率最高的?

解決了這兩個問題,next的計算也就簡單了

這樣,我們通過t[0]-t[k-1]=t[j-k]~t[j-1]可以確定每次匹配失敗時應該回溯的位置k,而滑動多遠才是效率最高的問題取k中最大值即可

接下來是具體的**

#include

#include

using namespace std;

void

getnext

(string t,

int next)

else k = next[k];}

}int

kmp(string p, string t)

if(p[i]

== t[j]

|| j ==-1

)}if(j >= t.

length()

)return i - t.

length()

;else

return-1

;}intmain()

BF演算法與KMP演算法

using system namespace kmp else count if j lenb 1 return i lenb else return 0 stathread static void main string args lenb p1.length,p2.length reval km...

BF演算法與KMP演算法

bf演算法思想 實現 public class bf int i 0 int j 0 i與j都從0號位置開始 while ilength j else if j sub.length 當j sub的長度時,說明sub陣列已經遍歷完了 else public static void main stri...

BF演算法與KMP演算法

bf演算法 即暴風 brute force 演算法,是普通的模式匹配演算法,它的思想就是將子串的第乙個字元與母串的第乙個字元進行匹配,若相等,則繼續比較子串的第二個字元和母串的第二個字元 若不相等,則比較母串的第二個字元和子串的第乙個字元,依次比較下去,知道得出最後的匹配結果。算是一種蠻力演算法。i...