当前位置: 首页 > news >正文

数据结构-4.5.KMP算法(旧版上)-朴素模式匹配算法的优化

朴素模式匹配算法最坏的情况:


一.实例:

第一轮匹配失败,开始下一轮的匹配:

不断的操作,最终匹配成功:

如上述图片所述,朴素模式匹配算法会导致时间开销增加,

优化思路:主串指针不回溯,只有模式串指针回溯

主串指针不回溯:

如果上述图中?是g:

如果上述图中?不是g:

另一种情况如下:

如果在j为5时匹配失败(j为模式串的指针),那么主串中分别以第5个字符即g,第6个字符即o,第7个字符即o开头的子串都不可能与模式串匹配,但第8个字符即g开头的子串有可能与模式串匹配成功,因为第8个字符即g能与模式串第一个字符g匹配上,而且在匹配过程中只是说明了子串中第9个字符与模式串中j为5时对应的字符不匹配,并没有说明子串中第9个字符与模式串中第二个字符不匹配,接下来只需要看i对应的字符即第9个字符是否与模式串中第二个字符即o是否匹配

再下一种情况:

如果在j为4时匹配失败(j为模式串的指针),那么主串中分别以第3个字符即g,第4个字符即o,第5个字符即o开头的子串都不可能与模式串匹配,此时就需要开始判断主串中第6个字符是否与模式串中第一个字符是否匹配,但其实j为4时匹配失败已经说明主串中第6个字符不是g了,因此主串中第6个字符已经不可能与模式串中第一个字符匹配,可知该方案并不是最优解,这种方案会使得多进行一次不必要的判断,但相比朴素模式已经优化了很多:

再再下一种情况:

如果在j为3时匹配失败(j为模式串的指针),那么主串中以第四个字符即o开头的子串一定与模式串匹配失败,但此时只知道主串中第五个字符不是o,因此可以判断主串中第五个字符是否是g,以主串中第五个字符开头来重新开始与模式串的匹配,相比朴素算法也优化了很多:

再再再下一种情况:

如果在j为2时匹配失败(j为模式串的指针),那么主串中以第三个字符即g开头的子串一定与模式串匹配失败:

汇总:

对于next数组,该数组的意思是当模式串的指针j等于next数组中的某一个值时,如果发生不匹配,如j为5时不匹配,就要回到j为2这个位置;

但当j为1时发生了不匹配,j设置为0:

代码:

形参中S为主串,T为模式串,还有与T对应的next数组,i指向主串,j指向模拟串,while循环中j不为0且i指向的字符和j指向的字符不相等时才执行else语句里的j=next[j]:

与朴素算法不同的有第一个if语句中j==0和第一个else语句中的j=next[j],

现在假设主串为xgoo,模式串为google,一开始j为1,指向模拟穿里的g,i为1,指向主串里的x,

由于i和j指向的字符不匹配(不相等),根据j=next[j],会让j=next[1],此时j为0,下一轮循环时发现j为0,

++i后i为2指向主串里的g,++j后j为1指向模拟串里的g,由此就推出为什么把next[1]设为0,因为可以利用这个信息做一个特殊的判断,当j为0时就说明主串的指针i也应该往右移动了,此外当i指向的字符和j指向的字符都相等时也应该把i和j同时往后移:


相关文章:

  • 图像增强论文精读笔记-Low-Light Image Enhancement via a Deep Hybrid Network
  • 初学Java基础Day14---初识面向对象,private关键字和封装及构造方法习题
  • SQLite SQL调优指南及高级SQL技巧
  • 19 基于51单片机的倒计时音乐播放系统设计
  • 举例说明 .Net Core 单元测试中 xUnit 的 [Theory] 属性的用法
  • 【iOS】计算器仿写
  • 数据链路层
  • MongoDB-aggregate流式计算:带条件的关联查询使用案例分析
  • MKV转MP4丨FFmpeg的简单命令使用——视频格式转换
  • 小蒋聊技术——DevOps 是什么“玩意”?
  • 爬虫——爬虫理论+request模块
  • SpringBoot Jar 包加密防止反编译
  • Django学习笔记一:MVT的示例
  • 用java编写飞机大战
  • OpenAPI3常用注解
  • pygame--超级马里奥(万字详细版)
  • 【Android 源码分析】Activity生命周期之onDestroy
  • 游戏中的对象池技术探索(一)
  • C语言之文件操作
  • GWAS分析中显著位点如何注释基因:excel???
  • 寒武纪陈天石:公司的产品力获得了行业客户广泛认可,芯片市场有望迎来新增量需求
  • 湛江霞山通报渔船火灾:起火船舶共8艘,无人员伤亡或被困
  • 湖南湘西州副州长刘冬生主动交代问题,接受审查调查
  • 为证明我爸是我爸,我将奶奶告上法庭
  • 中国海外发展:今年前4个月销售665.8亿元,花费305亿元拿地
  • 湖北宜昌:在青山绿水间解锁乡村振兴“密码”