博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第四章小结
阅读量:4514 次
发布时间:2019-06-08

本文共 1259 字,大约阅读时间需要 4 分钟。

第四章小结:

一、串

1、BF算法

 将模式串跟主串从开头一个一个比较,如果匹配失败,又从模式串第二个字符一次比较,匹配,++i;++j;不匹配,i=i-j+2;j=1;

  一般情况下,BF算法时间复杂度为O(m*n),数据量不大时候,执行时间近似为O(m+n),但如果是庞大数据,则有可能会运行超时。

  BF算法浅显易懂,但是对于大型数据处理来说实用性不高。

2、KMP算法

  KMP算法是基于我们对BF算法的不满而设计出来的(我个人是这样认为的),算法的改进重点放在如何减少不必要的比较上。

   

匹配失败:

S: aaaaabchu

T: aaab

BF算法:

S:aaaaabchu

T:   aaab

改进型算法:

S:aaaaabchu

T:   aaab

可以看出,改进型算法省去了BF算法的2次比较(在上面的情况下)。

我们的改进有什么依据吗?

  当失配时,可能在已比较的模式串中会有与主串当前位置字符相匹配的字符,而且每一个字符都有可能(这是在没有考虑其他字符是否匹配的情况下)。虽然每一个字符都有可能,但是其它字符也有一些确定的限制,那么,我 们就必须先考虑确定的限制。在满足确定性限制的情况下的可能性,才是真正有意义的。为了去除没有意义的,没有必要的比较,我们的限制是:模式串当前将要比较字符的前面的所有字符都必须匹配主串对应的字符,同时为了不遗漏,我们必须要确保这个相匹配的字符串是最长的。即是将模式串向后移动的过程中第一个完全匹配的位置。当我们拿一个字符串来和模式串进行匹配时,在失配的情况下,我们只需要拿满足以上限制条件所对应位置的字符来进行比较便可以了。因为上述条件下对应的字符便是在已有信息的基础上去除没有意义的比较后可能与主串匹配的字符。这个过程便是KMP算法的原理和思想。

                            总结上述分析,我们可以确定KMP算法的控制流程:

                             1.模式串与主串逐一比较

                             2.如果失配,模式串指针回溯到满足限制条件的地方,重新比较,而不是如同BF算法一样,主串前移一位从头比较

                             3.重复上述过程,直至匹配完成或失败

回溯到满足限制条件的地方需要用到函数next(即主串前移的步数)。那么这个next的代码该如何写呢?

  

next数组便是前缀中的最长相同前后缀,究竟什么意思呢,下面就来举几个例子:    对于abcdabd这个数组:  abcdabd          橙色的两组即为最长的前后缀    对于abccba这个数组:  abccba          橙色的两组即为最长前后缀 具体代码:
void next1(string t){    int i=0,j=0;    next[0]=-1;    while(i

KMP代码:

int KMP(string s,string t){    int i=0; int j=0;    next[0]=-1;    while(i

 

转载于:https://www.cnblogs.com/chenjianyuan/p/10707182.html

你可能感兴趣的文章
Android 开源控件与常用开发框架开发工具类
查看>>
记录一次网站打开卡--排故障过程
查看>>
第四章小结
查看>>
Windows7下python2.7.6环境变量配置
查看>>
java设计模式------代理模式
查看>>
WPF学习笔记----注释标记,使用自定义资源字典(style)文件的流程
查看>>
元素定位的八大法则
查看>>
Sublime Text 3 使用小记
查看>>
总结Pycharm里面常用的快捷键
查看>>
util.promisify 的那些事儿
查看>>
配置phpstudy+phpstorm+xdebug环境
查看>>
BZOJ 1079 [SCOI2008]着色方案
查看>>
[Win8.1系统]双系统
查看>>
HDU 3899 树形DP
查看>>
获取当前页面url信息
查看>>
Java容器类源码分析前言之集合框架结构(基于JDK8)
查看>>
linux下C/C++程序的内存布局
查看>>
单词计数问题
查看>>
php 魔术方法 __autoload()
查看>>
js div拖动动画运行轨迹效果
查看>>