bf演算法:
即暴風(brute force)演算法,是普通的模式匹配演算法,它的思想就是將子串的第乙個字元與母串的第乙個字元進行匹配,若相等,則繼續比較子串的第二個字元和母串的第二個字元;若不相等,則比較母串的第二個字元和子串的第乙個字元,依次比較下去,知道得出最後的匹配結果。算是一種蠻力演算法。
**:
int bf(str *s,str *sub,int
pos)
int i = pos;
int j = 0;
while( i < s->length && j < sub->length)
else
}if(j >= sub->length)
else
}
kmp演算法:
相比較於bf 演算法,kmp演算法建立了乙個子串的next陣列,用來儲存子串j回退的位置;
next 陣列各值的含義:代表當前字元之前的字串中,有多大長度的相同字首字尾。例如如果next [j] = k,代表j 之前的字串中有最大長度為k 的相同字首字尾。
此也意味著在某個字元失配時,該字元對應的next 值會告訴你下一步匹配中,模式串應該跳到哪個位置(跳到next [j] 的位置)。如果next [j] 等於0或-1,則跳到模式串的開頭字元,若next [j] = k 且 k > 0,代表下次匹配跳到j 之前的某個字元,而不是跳到開頭,且具體跳過了k 個字元。
kmp的next 陣列相當於告訴我們:當模式串中的某個字元跟文字串中的某個字元匹配失配時,模式串下一步應該跳到哪個位置。如模式串中在j 處的字元跟文字串在i 處的字元匹配失配時,下一步用next [j] 處的字元繼續跟文字串i 處的字元匹配,相當於模式串向右移動 j - next[j] 位。
**:
void getnext(int
*next,char *sub)//獲取子串的next值
else
}}int kmp(char *str,char *sub,int
pos)
int*next=(int
*)malloc(sizeof(int)*lenb);
getnext(next,sub);
assert(next!=null);
int i=pos;
int j=0;
while(iif(j==-1||str[i]==sub[j])
else
}free(next);
if(j>=lenb)
else
}
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演算法是普通 簡單 的查詢演算法,就是我們常說的暴力破解法。基本思想 圖示 分析 從bf演算法的思想可以得到他的時間複雜度為o m n 這是由於i指標一直要回退,但是有些情況不需要回退,就如上述圖示情況,回退之後和子串t還是不...