BF演算法與KMP演算法

2021-09-22 23:08:55 字數 2190 閱讀 3757

這兩種演算法都是字串匹配演算法,通俗來說,就是得到子串在主串中的位置。

bf演算法是普通(簡單)的查詢演算法,就是我們常說的暴力破解法。

基本思想:

圖示:

分析:

從bf演算法的思想可以得到他的時間複雜度為o(m*n),這是由於i指標一直要回退,但是有些情況不需要回退,就如上述圖示情況,回退之後和子串t還是不匹配,所以這就導致了多次毫無意義的比較,浪費了大量時間。雖然這種方法簡單易懂,但是時間複雜度太高,不適合在大規模的資料量下使用。

**詳解(c++):

```

#include#includeusing namespace std;

int bf(const string& s,const string& t,int pos)

else //失配

}if (j >= len_t) //子串完成匹配,則找到

else

}int main()

```

kmp演算法是對bf演算法的改進,主要是改進了bf演算法中,i指標回退的缺點,從而提高效率。

基本思想:

由此可見,kmp演算法的核心及難點就是找到j回退的位置k

演算法核心yi』xi(找j回退的位置k):

1、那麼j應該回退多少呢,回退到那個位置呢?那我們就用我們人的思維來考慮j回退後的位置;

由上述推論可得出找到j回退後的位置k的方法:

在子串t中,在匹配成功的「子串」中找到兩個最長的相等的字首子串和字尾子串,兩個子串有如下特點:

所以這兩個最長的相等的真子串的長度就是k會退後的位置。

2、用我們人的思維推出了找到j回退後的位置k的方法,那麼我們如何將這種方法應用到**中,讓計算機識別這種方法呢?

因為子串t的每乙個位置都可能發生不匹配,也就是說我們要計算每乙個位置j對應的k,所以用乙個陣列next來儲存,next[j] = k表示當s[i] != t[j]時,j指標的下乙個位置。

next陣列的實現:

3、如上方法,看似已經很完美了,但是還存在一定的瑕疵

所以我們將nextval陣列裡儲存的值就叫修正後的k,即就是j的最終回退位置,修正後的**如下:

static int *git_nextval(const string& t)

else

}nextval[0] = -1;

for (int i = 1; i < len; i++)

else //t[i] != t[k]

}deletenext;

return nextval;

}

演算法分析:kmp演算法相比於bf演算法最主要的一點就是i不需要回溯了,它的時間複雜度可以達到o(m+n)。

它的核心其實就是next陣列,只要理解了next陣列kmp演算法也就算是解了。

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