BF、kmp算法
第七周 字符串匹配
BF算法,kmp算法
BF:时间复杂度为 O(m*n)
int Index_BF(SString S, SString T, int pos)
{
int i = pos, j = ;
while (i <= S.length &&j <= T.length)
{
if (S.ch[i] == T.ch[j])
{
++i;
++j;
}
else {
i = i - j + ;
j = ;
}
}
if (j > T.length)
return i - T.length;
else
return ;
}
模式串和主串均是存放于字符数组中。(这里是从下标为1开始存储,以便后面操作)
BF比较简单,直接暴力匹配。每次匹配失败,i 回溯到本轮起始位置的下一位。(效率较低)
测试:
结果:
————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————-——
KMP:时间复杂度为O(m+n)
因为kmp的思想要写的过程太多(我懒得打字),还有结合字符串图更清晰
所以借鉴:https://www.cnblogs.com/yjiyjige/p/3263858.html
感觉kmp还是很好理解,老师让我讲一遍却又表达不清楚(自己能懂就是不知道怎么把它完整表达出来)
主要就是 i不用回溯,设立了next[ ]值,即k值,模式串中失配位对应的k值即为下一轮 j重新开始匹配的位置
至于k值得来历,简单点讲 就是为了模式串与主串匹配时减少BF无意义的比较情况,需要在部分匹配成功的
情况下 一次移动k-1 位来提高效率。假设在S主串中的第i位,T模式串的第j为失配,那么i不动,下一次匹配就从第j位
对应的k值开始(j=k=next [ j ]),即下一次从模式串的第k位开始匹配。
计算k值:从kmp算法中,失配后比较的是S的第 i 位与T的第 k 位,那么T中 k 前面的串(k-1)个字符肯定是和S中
i 的前面(k-1)个字符是匹配的。由匹配成功的部分可以得知:S中的i 前面(k-1)个字符又与T中j 前面的(k-1)个字符
是已经匹配成功的,所以前面两句话就等于:
T[1...k-1] = T[ j-(k-1)...j-1]
从上面的式子可以看出模式串与主串的比较 变成了模式串自己前缀和后缀的比较,这样找到模式串前缀与后缀所能匹配的最大
长度就等于我们的k-1,也就找出了k;
int Index_KMP(SString S, SString T, int pos, int next[])
{
int i = pos, j = ;
while (i <= S.length&&j <= T.length)
{
if (j == || S.ch[i] == T.ch[j])
{
++i;
++j;
}
else
j = next[j];
}
if (j > T.length)
return i - T.length;
else
return ;
}
下面是next[ ]值计算
例子:
算法:
上面的next值在某些情况下仍有点缺陷,所以有了一个修正next算法
修正next算法:
结果:
kmp算法还是挺重要的,理解清楚了还应该记住模板,说不定日后或者OJ用得着呢。
BF、kmp算法的更多相关文章
- 第4章学习小结_串(BF&KMP算法)、数组(三元组)
这一章学习之后,我想对串这个部分写一下我的总结体会. 串也有顺序和链式两种存储结构,但大多采用顺序存储结构比较方便.字符串定义可以用字符数组比如:char c[10];也可以用C++中定义一个字符串s ...
- 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)
相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...
- 串的两种模式匹配方式(BF/KMP算法)
前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最重要的操作之一,而不同的算法实现有着不同的 ...
- BF算法与KMP算法
BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- 串匹配模式中的BF算法和KMP算法
考研的专业课以及找工作的笔试题,对于串匹配模式都会有一定的考察,写这篇博客的目的在于进行知识的回顾与复习,方便遇见类似的题目不会纠结太多. 传统的BF算法 传统算法讲的是串与串依次一对一的比较,举例设 ...
- BF算法和KMP算法 python实现
BF算法 def Index(s1,s2,pos = 0): """ BF算法 """ i = pos j = 0 while(i < ...
- 串、串的模式匹配算法(子串查找)BF算法、KMP算法
串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...
- 字符串模式匹配算法1 - BF和KMP算法
在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...
随机推荐
- 第2章地址Address(WCF全面解析3)
WCF顾明思义,就是在Windows平台下解决通信(C,Communication)的基础框架(F,Foundation)问题. 终结点是WCF最为核心的对象,因为它承载了所有通信功能.服务通过相应的 ...
- Mysql双机热备实现数据库高可用
mysql双主热备,也称主主互备,目的是mysql数据库高可用,只支持双机,原因是mysql的复制是一主多从,但一个从服务器只能有一个主服务器. 双机热备的条件是双机mysql版本必须一致. 服务器分 ...
- iOS中NSDate常用转换操作整合
//当前时间格式化, 例:YYYY-MM-dd-EEEE-HH:mm:ss + (NSString *)getCurrentDataWithDateFormate:(NSString *)format ...
- Bash CookBook(一)--基础
Bash 是brian Fox在1988年1月10号出于Richard Stallman的建议而写的. 一. 运行模板: 交互登陆的shell,登陆后bash会读取和执行/etc/profile. ...
- distributed lock manager (DLM)(分布式管理锁)
A distributed lock manager (DLM) provides distributed software applications with a means to synchron ...
- [SoapUI] 如何让某个步骤的Assertion失败之后继续执行后面的步骤
To continue tests executing after failed test step you need disable "Abort on error" optio ...
- Storm+kafka的HelloWorld初体验
从16年4月5号开始学习kafka,后来由于项目需要又涉及到了storm. 经过几天的扫盲,到今天16年4月13日,磕磕碰碰的总算是写了一个kafka+storm的HelloWorld的例子. 为了达 ...
- Java 前台后台数据传递、中文乱码解决方法
1.向前台传递数据;2.向后台传递数据;3.ajax post 提交数据到服务端时中文乱码解决方法;4.数组类型参数传递; 1.向前台传递数据:1.1 字符串数据传递: 这种方式只是单一的向前台传递 ...
- myeclipse工程中library 和 web-inf下lib的区别
eclipse工程下的library是用来编译里面的src中java文件的实际发布到tomcat时,仅仅只复制了WEB-INF/lib里面的jar包,所以出现eclipse可以正常编译但tomcat运 ...
- Python2.7.9 编码问题
最近学一学网络爬虫,遇到第一件头疼的事情就是编码问题, 看了很多教程讲得不清楚, 现在整理一下,希望以后查看方便一些 使用 sys.getdefaultencoding() 查看Python的 ...