字符串匹配--暴力搜索算法

主要特征

1、没有预处理阶段

2、需要常量额外空间

3、通常需要模式串窗口向右移动一个位置

4、可以按照任意顺序进行比较

5、搜索的时间复杂度为O(mn)

6、文本字符期望比较次数:2n

本文地址:http://www.cnblogs.com/archimedes/p/brute-force-algorithm.html,转载请注明源地址。

算法描述

暴力搜索算法由文本串中从0到n-m所有位置的比较组成,无论是否从模式串的起始位置开始,每次匹配过后,模式串向右移动一位。暴力搜索算法没有预处理阶段,文本串和模式串需要常量额外空间,在搜索阶段的文本串的字符可以按照任意顺序进行比较,匹配的时间复杂度为O(mn),

C代码实现

int BF(char *x, int m, char *y, int n) {
   int i, j;
   /* 搜索*/
   for (j = 0; j <= n - m; ++j) {
      for (i = 0; i < m && x[i] == y[i + j]; ++i);
          if (i >= m)
              return j;
   }
}

上面的算法可以改写为下面更加高效的算法:

#define EOS '\0'
   
int BF(char *x, int m, char *y, int n) { 
  char *yb; 
  /* 匹配*/ 
  for (yb = y; *y != EOS; ++y) 
      if (memcmp(x, y, m) == 0) 
          return y - yb;
}

举例

第1次尝试

GCATCGCAGAGAGTATACAGTACG
1234 
GCAGAGAG 
第2次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第3次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第4次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第5次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第6次尝试

GCATCGCAGAGAGTATACAGTACG
 12345678 
 GCAGAGAG 
第7次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第8次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第9次尝试

GCATCGCAGAGAGTATACAGTACG
 12 
 GCAGAGAG 
第10次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第11次尝试

GCATCGCAGAGAGTATACAGTACG
 12 
 GCAGAGAG 
第12次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第13次尝试

GCATCGCAGAGAGTATACAGTACG
 12 
 GCAGAGAG 
第14次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第15次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第16次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG 
第17次尝试

GCATCGCAGAGAGTATACAGTACG
 1 
 GCAGAGAG
    原文作者:wuyudong
    原文地址: https://www.cnblogs.com/wuyudong/p/brute-force-algorithm.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞