標籤:基礎 while 代碼 div 判斷 load 改進 amp data
判斷兩個串之間是否存在主串與子串的關係,這個過程稱為串的模式比對。
在串的模式比對過程,子串 T 通常被叫做“模式串”。普通的模式比對(“BF”演算法)
判斷兩個串是否存在子串與主串的關係,最直接的演算法就是拿著模式串,去和主串從頭到尾一一比對,這就是“BF”演算法的實現思想。
將提供的模式串(例如 “abcac” )從主串的第一個字元開始,依次判斷相同位置的字元是否相等,如果全部相等,則匹配成功;反之,將子串向後移動一個字元的位置,繼續與主串中對應的字元匹配。
演算法運行過程:(圖中,i 和 j 表示匹配字元在數組中的位置下標)
,第一次匹配,模式串和主串匹配到第三個字元時,匹配失敗;模式串向右移動一個字元的位置,還是從第一個字元 ‘a’ 和主串的第二個字元 ‘b’ 相匹配,匹配失敗;模式串繼續後移一個字元的位置,繼續匹配。
實現代碼:
#include <stdio.h>#include <string.h>
int sel(char *S, char *T)
{ int i = 0, j = 0; while (i<strlen(S) && j<strlen(T))
{ if (S[i] == T[j])
{ i++; j++; }
else
{ i = i-j+1; j = 0; } }
//跳出迴圈有兩種可能,i=strlen(S)說明已經遍曆完主串;j=strlen(T),說明模式串遍曆完成,在主串中成功匹配 if (j == strlen(T))
{ return i-strlen(T)+1; } //運行到此,為i==strlen(S)的情況 return 0;}
int main()
{ int add = sel("ababcabcacbab", "abcac"); printf("%d", add);
return 0;}
運行結果: 6
“BF”演算法的時間複雜度
“BF” 演算法在最理想的情況下的時間複雜度為O(m)( m 是模式串的長度,也就是第一次匹配就成功的情況)。
一般情況下,"BF"演算法的時間複雜度為O(n+m)(n是主串的長度,m是模式串的長度)。
最壞的情況下的時間複雜度為O(n*m)(例如主串 S 為“000000000001”,模式串 T ”001”,每次匹配時,直到匹配最後一個元素,才得知匹配失敗,運行了 n*m 次)。
總結
“BF”演算法在進行模式比對時,從主串的第一個字元開始,每次失敗,模式串向後移動一個字元的位置,繼續匹配,無腦式操作。但是整個演算法受測試資料的影響非常大,在解決實際問題時,由於資料量龐大,時間複雜度往往會很高。
所以,對在“BF”演算法的基礎上,對其做了改進,就是下一節要講的“KMP”演算法。
資料結構19: BF演算法(普通模式比對演算法)