zoukankan      html  css  js  c++  java
  • 数据结构(三)串---BF算法(朴素模式匹配)

    (一)BF算法了解

    BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法。
    BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;
    若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。

    (二)算法模拟

    开始匹配:

    第一次匹配:H和L不相等,串S向下移一个,串T回到原位置

    第二次匹配:L和O不相等,串S移向下一个位置,串T回到原位

    第三次匹配:L和L匹配上了,此位置记为A,串S移向下一个位置,串T也移向下一个位置,继续匹配

    第四次匹配:L和E不匹配,将串S移动到标记为A的下一个位置重新进行匹配,将串T回到原位

    第五次匹配:L和L匹配上了,将此位置记为B,串S移向下一个位置,串T也移向下一个位置,继续匹配

    第六次匹配:E和E匹配上了,串S移向下一个位置,串T也移向下一个位置,继续匹配

    第七次匹配:W和W匹配上了,串T全部匹配成功,一次匹配成功。

    (三)代码实现:前面我们实现顺序存储串的时候使用的就是BF算法

    int Index(String S, String T, int pos)  //返回子串T在主串S中第pos个字符之后的位置,若不存在,返回0
    {
        int i, j;
        i = pos;  //用于主串S中当前位置下标,若pos不为1时,则从pos位置开始匹配
        j = 1;   //用于子串T多种当前位置下标值
        while (i<=S[0]-T[0]+1&&j<=T[0])  //若i的长度小于可匹配长度,且j小于T的长度时循环
        {
            if (S[i]==T[j])  //两字符相等时继续匹配
            {
                j++;
                i++;
            }
            else  //指针后退重新匹配
            {
                i = i - j + 2;    //注意这个索引的加2,i退回到上次匹配首位的下一个位置
                j = 1;  //j退回子串T的首位
            }
        }
        if (j > T[0])
            return i - T[0];
        return 0;
    }
    BF算法也是回溯法

    (四)性能分析

    S=000000000000000000000000000001
    T=0000001
    最坏的时间复杂度为O((n-m+1)*m)
    在实际运用中,对于计算机来说,处理的都是二进制位的0和1的串,一个字符可以看做8位0/1串,汉字和图片更多,所以当我们使用BF匹配效率就会特别低
  • 相关阅读:
    jython resources
    Installing a Library of Jython ScriptsPart of the WebSphere Application Server v7.x Administration Series Series
    jython好资料
    ulipad install on 64bit win7 has issue
    an oracle article in high level to descibe how to archtichre operator JAVA relevet project
    table的宽度,单元格内换行问题
    Linux常用命令大全
    dedecms系统后台登陆提示用户名密码不存在
    登录织梦后台提示用户名不存在的解决方法介绍
    Shell常用命令整理
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9451300.html
Copyright © 2011-2022 走看看