【数据结构与算法】BF算法(详解)

本文详细介绍了BF算法,一种用于主串中查找与模式串相匹配子串的串模式匹配算法。通过实例演示了BF算法的匹配过程,分析了其时间复杂度,并提供了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)BF算法

也就是串的模式匹配算法,在主串中查找与模式T(副串)相匹配的子串,如果匹配成功,找到该子串在主串出现的第一个字符。
模式匹配不一定是从主串第一个字符开始,可以在主串中指定起始位置。


(二)演示

举个例子:
主串:我是大明我我是小明嘿嘿嘿
模式串:我是小明

现在我们要在主串中找到符合模式串的连续字符。
下面是匹配过程描述:

假设 i 从0开始,j 初始都为0,当 S[i]==T[j] 时,i++,j++,当 S[i]!=[j] 时,i返回起始值再加一,j回到0。

  • 第一趟匹配:
    起始值i=0,j=0

               i=2
我    是    大    明    我    我    是    小    明    嘿    嘿    嘿
               j=2
我    是    小    明

“大”和“小”不匹配。i变为0再加1,“是”字符的下标。j变为0

       i=1
我    是    大    明    我    我    是    小    明    嘿    嘿    嘿
        j=0
        我    是    小    明

  • 第二趟匹配:
    S[i]!=T[j],一直执行i返回起始值再加一,j回到0,直到S[i]==T[j]
    S[2]!=T[0],S[3]!=T[0],S[4]==T[0]

                              i=4
我    是    大    明    我    我    是    小    明    嘿    嘿    嘿
                              j=0
                              我    是    小    明

S[i]==T[j],i++,j++

                                      i=5
我    是    大    明    我    我    是    小    明    嘿    嘿    嘿
                                      j=1
                              我    是    小    明

又不匹配了。

  • 第三趟匹配:
    i回到起始值再加一 i=5,j=0

                                      i=5
我    是    大    明    我    我    是    小    明    嘿    嘿    嘿
                                      j=0
                                      我    是    小    明

S[i]==T[j],i++,j++

                                                            i=8
我    是    大    明    我    我    是    小    明    嘿    嘿    嘿
                                                            j=3
                                      我    是    小    明

匹配成功,返回i的起始值(i-T.length)。


(三)时间复杂度

设主串长度为n,模式串长度为m,假设主串从第 i 个位置与模式串匹配成功,则此前 i-1 趟字符总比较了 i-1 次,第i趟成功比较字符次数为m,则总比较次数为 i-1+m 次。
对于成功匹配的主串,其起始位置由 1 到 n-m+1,假定这 n-m+1 个起始位置上的匹配概率相等,则最好的情况下匹配成功的平均比较次数为:
在这里插入图片描述
所以最好情况下平均时间复杂度是O(n+m)
最坏情况是每次匹配不成功发生在模式串最后一个字符,直达主串最后一个字符与之匹配。复杂度为: O(n*m)

(四)代码实现

public int IndexOfBF(String S,String T,int pos){
	char []a = S.toCharArray();
	char []b = T.toCharArray();
	int i=pos;int j=0;
	while(i<S.length() && j<T.length()){
		if(a[i]==b[j]){	//	继续比较
			i++;j++;
		}
		else{	//i后退重新匹配
			i=i-j+1;j=0;
		}
	}
	if(j>=T.length()) //匹配成功
		return i-T.length();
	else	//匹配失败
		return 0;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值