字符串匹配之---BF算法(暴力破解法)

        写完第一篇字符串匹配文章,发现竟然没有介绍啥是字符串匹配算法,啥是KMP,直接就开讲KMP的next数组有点唐突。而在我打算写第二篇的时候发现,我们为什么要有KMP算法,它到底比普通的算法好在哪里?回过头来想想应该把普通的暴力法也写写,这样才能明白它们的好。同时,不要以为它是暴力法就认为它不好,你没必要掌握它。同学,你知道吗?几乎所有标准库中类似字符串匹配的函数(如: java-indexof)都是采用的我们今天要将的BF(Brute Force)方法,原因见StackOverflow

        好,下面首先正式把问题摆出来,给定两个串S="s0, s1, s2, ...., sn", T="t0, t1, t2,..., tn", 在主串S中查找字串T的过程称为字符串匹配问题,T称为模式串。

BF(Brute Force)算法,应该很容易写出来,下面先给出伪码:
一、伪码
1. 首先设定 S 和 T 的起始比较下标 i 和 j;
2. 循环直到 i+m>n 或者T中的字符都比较完(j==m)
2.1 如果S[i]==T[j], 继续比较S和T的下一个字符,否则
2.2 将 i 和 j 回溯,准备下一轮比较
3. 如果T中的字符都比较完(j==m),则返回比较的起始下标
    否则返回-1,表示匹配失败

二、实现

     int strStr(const char *S, const char *T){
          if(S==NULL||T==NULL) return -1;
          int n = strlen(S);
          int m = strlen(T);
          int i=0;
          while( i+m<=n){
               int k=i, j=0;
               for(; j<m&&k<n&&S[k]==T[j]; ++k,++j) ;
               if(j==m) return i;  //  匹配成功,返回比较开始位置
               ++i;
          }
          return -1;   // 匹配失败
     }

三、实例
假定给定主串 S="ababcabcacbab", 模式 T="abcac", BF匹配过程如下:

       

四、BF算法的缺点
      BF算法的优点就是简单可靠,这跟现实中的东西一样,越简单的东西越是信得过的(纯属娱乐:东哥也说了'她是我见过的最单纯的女孩'),可见简单就是好,而复杂的东西限制要求多。
      BF算法的确定就是一遇到比较失败的时候就需要回退到前面重新开始比较,之前比较匹配过的信息完全用不上,一句话就是不智能嘛。

五、标准库为啥要采用BF而不采用KMP,BM喃?
        打开上面StackOverflow的链接,就能见着答案,我这里把英文贴出来,为防止有些童鞋一见English就头大,大概翻译了下。
        The more advanced string search algorithms have a non-trivial setup time. If you are doing a once-off string search involving a not-too-large target string, you will find that you spend more time on the setup than you save during the string search.And even just testing the lengths of the target and search string is not going to give a good answer as to whether it is "worth it" to use an advanced algorithm. The actual speedup you get from (say) Boyer-Moore depends on the values of the strings; i.e. the character patterns.
        The Java implementors have take the pragmatic approach. They cannot guarantee that an advanced algorithm will give better performance, either on average, or for specific inputs. Therefore they have left it to the programmer to deal with ... where necessary.
        大概意思就是,像KMP,BM这些高级算法的会有预处理时间和会消耗一些空间,在处理一些不是非常大的字符串的时候,时间不会有太大优势,而且还会占用一些空间。


如果你觉得本篇对你有收获,请帮顶。
另外,我本人开通了微信公众号--分享技术之美,我会不定期的分享一些我学习的东西.
你可以搜索公众号: swalge  或者扫描下方二维码关注我


(转载文章请注明出处: http://blog.csdn.net/swagle/article/details/24012567 )



  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
BF算法(Brute-Force算法),也称为朴素匹配算法,是一种简单直观的字符串匹配算法。它的基本思想是从主串的第一个字符开始,依次与模式串的每个字符进行比较,如果匹配成功,则继续比较下一个字符,否则主串指针后移一位,重新开始匹配。这个过程类似于暴力解密码的过程,因此也被称为暴力匹配算法。 下面是BF算法的C语言实现: ```c #include <stdio.h> #include <string.h> int BF(char* s, char* p) { int i = 0, j = 0; int s_len = strlen(s); int p_len = strlen(p); while (i < s_len && j < p_len) { if (s[i] == p[j]) { i++; j++; } else { i = i - j + 1; j = 0; } } if (j == p_len) { return i - j; } else { return -1; } } int main() { char s[] = "hello world"; char p[] = "world"; int pos = BF(s, p); if (pos != -1) { printf("匹配成功,位置为:%d\n", pos); } else { printf("匹配失败\n"); } return 0; } ``` 在上面的代码中,BF函数接受两个参数,分别是主串s和模式串p。在函数中,我们使用两个指针i和j分别指向主串和模式串的第一个字符,然后依次比较它们的字符是否相等。如果相等,则继续比较下一个字符,否则主串指针后移一位,重新开始匹配。如果模式串匹配成功,则返回匹配的位置,否则返回-1。 需要注意的是,BF算法的时间复杂度为O(m*n),其中m和n分别为主串和模式串的长度。因此,当主串和模式串的长度较大时,BF算法的效率会比较低。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值