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

(一)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;
  • 31
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
数据结构是计算机存储、组织数据的方式,算法是解决问题的步骤和方法。数据结构和算法是计算机科学中最基础、最重要的两个领域之一。掌握数据结构和算法可以帮助我们更好地理解计算机科学的本质,提高编程能力,解决实际问题。 常见的数据结构包括数组、链表、栈、队列、树、图等。常见的算法包括排序、查找、递归、分治、动态规划等。 在学习数据结构和算法时,需要掌握以下知识点: 1. 时间复杂度和空间复杂度:用来衡量算法的效率和资源消耗。 2. 数组:一种线性数据结构,用来存储一组相同类型的元素。 3. 链表:一种线性数据结构,用来存储一组元素,每个元素包含一个指向下一个元素的指针。 4. 栈:一种后进先出(LIFO)的数据结构,用来存储一组元素。 5. 队列:一种先进先出(FIFO)的数据结构,用来存储一组元素。 6. 树:一种非线性数据结构,由节点和边组成,每个节点可以有多个子节点。 7. 图:一种非线性数据结构,由节点和边组成,每个节点可以有多个相邻节点。 8. 排序算法:用来将一组元素按照一定的顺序排列的算法,包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。 9. 查找算法:用来在一组元素中查找指定元素的算法,包括线性查找、二分查找、哈希查找等。 10. 递归算法:一种通过调用自身来解决问题的算法。 11. 分治算法:一种将问题分解成多个子问题来解决的算法。 12. 动态规划算法:一种通过将问题分解成多个子问题来解决的算法,通常用于求解最优化问题。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值