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...