BF演算法與KMP演算法

2021-08-21 18:54:42 字數 1261 閱讀 3290

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還是不...