兩種簡單的字串匹配演算法

2022-09-19 01:12:12 字數 1058 閱讀 1087

在機試筆記4中的統計子字串個數題目中,使用了一種時間複雜度為o(n*m)的字串匹配演算法,他也叫暴力匹配演算法或者bf演算法。在實際的開發中,它卻是乙個比較常用的字串匹配演算法。原因有以下幾點:

第一,實際的軟體開發中,大部分情況下,模式串和主串的長度都不會太長。而且每次模式串與主串中的子串匹配的時候,當中途遇到不能匹配的字元的時候,就可以就停止了,不需要把 m 個字元都比對一下。所以,儘管理論上的最壞情況時間複雜度是 o(n*m),但是,統計意義上,大部分情況下,演算法執行效率要比這個高很多。

第二,樸素字串匹配演算法思想簡單,**實現也非常簡單。簡單意味著不容易出錯,如果有 bug 也容易暴露和修復。在工程中,在滿足效能要求的前提下,簡單是首選。這也是我們常說的kiss(keep it ****** and stupid)設計原則。

所以,在實際的軟體開發中,絕大部分情況下,樸素的字串匹配演算法就夠用了。

乙個長為n的主串中去查詢長為m的模式串,最多要對比n-m+1個子串與模式串。

另乙個字串匹配演算法叫rk演算法,它的演算法思想是:

我們通過雜湊演算法對主串中的 n-m+1 個子串分別求雜湊值,然後逐個與模式串的雜湊值比較大小。如果某個子串的雜湊值與模式串相等,那就說明對應的子串和模式串匹配了。這裡當然會有雜湊衝突的可能。

雜湊函式的設計:

假設字串只有小寫字母,可以把每個子字串當成乙個26進製數,雜湊函式就是把這個26進製數轉成10進製數。

**如下:

#include using

namespace

std;

double my_hash(string

str)

return

sum;

}int

main()

double v =my_hash(b);

int sum = 0

;

for(int i=0;i1;i++)

cout

<< sum

}

當然這個**還有需要優化的地方,一是計算指數可以變成查表的方式,二是求其十進位制時前後兩個子串的計算是有交集的。

學習兩種字串匹配演算法BF演算法和RK演算法

問題 給你兩個字串a和b,請你判斷b是否是a的子串,並且返回b在a中第一次出現的位置。示例1 a abcdefg b cde return 2 示例2 a abcdefg b acg return 1 更優方案 rk演算法 由演算法兩位發明者rabin和karp的名字命名的 bf演算法只是簡單粗暴對...

串的兩種模式匹配演算法

靜時亦覺意思好,才遇事便不同,如何?是徒知靜養而不用克己工夫也。如此,臨事便要傾倒。人須在事上磨,方立得住,方能 靜亦定,動亦定。此時正宜用功。若此時放過,閒時講學何用?人正要在此等時磨鍊。子串的定位操作 串的模式匹配 挨個遍歷,例如在asdfghjkl中尋找dfg,需要將dfg與asdfghjkl...

C語言的兩種字串

c語言中的兩種字串 1.兩種字串的表示 1.字串陣列 char str1 hello char str2 6 hello 注意 在字串 陣列 初始化時sizeof str 的大小應該比你想要的大小 1,因為在作為字串時,會有乙個 0 自動成為字串的元素 上述的例子如果變成 char str2 5 h...