串--BF算法

一. 前言

        BF全称为Brute-Force,是一种简单匹配算法,采用穷举法的思路。即从主串S的每一字符开始依次与子串T的字符进行匹配。其中的子串T称为模式串,如果主串中包含一个连续子串字符序列与模式串相等,则返回这个子串第一个字符在主串中的序号,否则匹配失败,就返回0。

二. BF算法的完整代码

        因为BF算法是在串的基础上实现的,所以首先需要创建一个串的结构类型定义如下所示:

#define MAXSIZE 255
typedef struct{
    char ch[MAXSIZE+1]; //实际数组比最大长度多一,因为一般序号为0的位置不存放数据
    int length;
}SString;

在定义好串的结构类型之后,我们来看下BF算法的一个完整代码:

int Index_BF(SString S,SString T){
    int i=1,j=1;
    while(i<=S.length&&j<=T.length){
        if(S.ch[i]==T.ch[j]){        //如果第一个位置匹配成功,则继续下一个位置的匹配
            ++i;
            ++j;
        }
        else{            //匹配失败,进行i的回溯,j重新赋值为1.
            i=i-j+2;
            j=1;
        }    
    }
    if(j>T.length) return i-T.length;  //全部匹配成功,返回在主串中出现的序号
    else return 0;            //模式匹配失败,返回0
}

这段代码是从主串的第一个位置开始进行查找匹配的,我们也可以从主串的任意位置开始匹配。如下所示:

int Index_BF(SString S,SString T,int pos){
    int i=pos,j=1;                //从主串的pos位置开始进行查找
    while(i<=S.length&&j<=T.length){
        if(S.ch[i]==T.ch[j]){
            ++i;
            ++j;
         }
        else{
            i=i-j+2;
            j=1;
        }
    }
    if(j>T.length) return i-T.length;
    else return 0;
}

三. BF算法的时间复杂度

        假设n为主串的长度,m为模式串的长度,BF算法最好的情况就是从第一个位置就一直匹配成功,所以时间复杂度也就为模式串的长度即m。

下面我们看下BF算法的最坏时间复杂度:

 

最坏时间复杂度就为n*m。从中我们可以看出,BF算法的效率并不是很高,因此这就会引出我们的KMP算法。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值