# KMP算法
# 首先计算next数组,即我们需要怎么去移位
# 接着我们就是用暴力解法求解即可
# next是用递归来实现的
# 这里是用回溯进行计算的
def calNext(str2):i = 0next = [-1]j = -1while i < len(str2) - 1:if j == -1 or str2[i] == str2[j]:  # 首次分析可忽略i += 1j += 1next.append(j)else:j = next[j]  # 会重新进入上面那个循环return nextprint(calNext('aabaaaaa'))

应该说KMP算法中j = next[j]是最难以理解的,

很多教材或博文在这个地方都是讲得比较含糊或是根本就一笔带过,甚至就是贴一段代码上来,为什么是这样求?怎么可以这样求?根本就没有说清楚。而这里恰恰是整个算法最关键的地方。

如代码块,输出台控制输出:

[-1, 0, 1, 0, 1, 2, 2, 2]

如果将j = next[j],换成j = next[0],输出台有如下结果:

[-1, 0, 1, 0, 1, 2, 0, 1]

可以发现结尾的两个元素发生了改变,我们改换后发生了什么?

正常来说,前几个元素没有太大变化,逻辑都是通过"指针"i,j,遍历str2,如果前几个元素相同,除了一号元素初始值外,i,j都是递增,直到后缀发生改变,此时为了与朴素算法区分,KMP算法要求遍历指针i不能回退,但j作为我们的“工具人”,我们可以让他回退,尝试重新寻找与后缀匹配的前缀

如图,前缀部分ABAC与后缀部分ABAB相比,不能成功匹配,此时若想要让指针j回退,问题在于回退到哪里,如果回退到初始位置j = next[0],则相当于重新匹配,但此时有个很大的问题,虽然i没有回退,但若从头开始匹配,则刚才匹配的结果就前功尽弃了,我们希望就算后缀ABAB匹配不到合适的等长前缀,但也能匹配到较短的前缀AB,而若直接让j回退到0,则当前的next将直接变成0!

因此,我们希望工具指针j不要退得太快,要充分利用已有的匹配结果,即已有的next数组

由此理解,j = next[j]就可以被认为是j指针返回到不成功前缀的上一次成功前缀,即大前缀里的小前缀,这样就保证了j不会回退太快而导致前功尽弃的问题

显然,对于0000010,光next[]的初始化过程中,就出现了类似递归的效应:当next前五位[-1,0,1,2,3,_]计算好时,数字1一出现,我们的程序就不得不含恨将j指针一步一步退回去直到发现最后结果还不如j = next[0]!但说到底,这种情况也只是求next[]的最糟糕情况了。

KMP的next迷思相关推荐

  1. 机器学习研究的七个迷思

    作者 Oscar Chang 总结了机器学习研究中的七大迷思,每个问题都很有趣,也可能是你在研究机器学习的过程中曾经遇到过的"想当然"问题.AI 前线对这篇文章进行了编译,以飨读者 ...

  2. Gartner:解开关于人工智能的六个迷思

    来源:Gartner "人工智能将自动执行所有工作并让人类失业.""人工智能只是一种虚构的技术.""机器人将占领整个世界." 围绕人工智能的 ...

  3. ​赠书:面向对象的两大迷思,再给你们解答一次

    面向对象是目前最流行的一种程序设计和实现思想.无论从事企业级开发.互联网应用开发,还是手机软件开发,都会用到面向对象的技术. 在主流的编程语言中,C++.Java.C#.PHP.Python等都是支持 ...

  4. 软件项目管理0709:一个项目经理对产品方案的迷思

    软件项目管理0709:一个项目经理对产品方案的迷思已经两周了,我一直被产品方案折磨着,新领导入职之后由于公司产品经理的缺失,领导让我做一下自己的项目的简单的产品方案的ppt,但是反复修改,总是有这样那 ...

  5. 绝非偶然 苹果iPhone领先5年背后的迷思 【推荐】

    今天看到一个好的文章,[绝非偶然 苹果iPhone领先5年背后的迷思],地址如下: http://www.chinamac.com/2010/1208/58274.html 1 团队 2 技术 3 不 ...

  6. 全局中断_实时性迷思(3)——80%时间屏蔽了中断,实时性还有救么?

    [写在前面的话] 在本系列的第一篇文章<实时性迷思(1)--快是优点么?>中,我们介绍了实时性的基本模型: 并得出两个重要的结论: 实时性只关注"是否能在实时性窗口内完成对应事件 ...

  7. 私有云之迷思:未来是什么?

    本文讲的是私有云之迷思:未来是什么?,[编者的话]非常好的一篇文章,作者从OpenStack目前的困境讲起,聊到了私有云的产生背景,进而介绍了云计算的发展史.从云计算诞生的初衷以及现在流行的分布式应用 ...

  8. IT从业者的迷思与求解之道——座谈会实录摘选

    本次座谈会于上周六开始,由于网络原因,很多国内的小伙伴们没有能够连进去,挺遗憾的.所以我整理了本次座谈会的部分内容,希望能对大家有所帮助. 洞察力 主持人:大家好我们来自开源社群,今天举行在线it社区 ...

  9. IT从业的迷思与破解之道(更新)

    我只是单纯做技术的程序员,什么靠微信广告攒钱这些,跟我没有半毛钱关系, 初衷很简单,只重视正三观的正确技术知识分享 在这到处都是线上培训,付费知识的社群里,随便搜个词都有您想要的内容哪轮到我们. 技术 ...

最新文章

  1. 智办事2.0APP全新发布,不可错过的3个亮点!
  2. mysql中的多行查询结果合并成一个
  3. expressjs路由匹配规则
  4. java 省市区数据data
  5. 网络管理:3分钟排障秘技,一招胜过十年功 | 文末有彩蛋
  6. 近期几个ASP.NET开发经验(二)
  7. Linux有问必答:如何在Linux命令行中刻录ISO或NRG镜像到DVD
  8. 世界上最健康的作息时间表健康十不易
  9. eclipse中如何把中文变成英文?
  10. 一个圆周率的计算公式代码
  11. 【Excel-2010】四种方式筛选重复数据
  12. 当幸福来敲门,不是影评
  13. 华为8月9日发布鸿蒙,8月9日华为正式发布鸿蒙系统
  14. Android 打造炫目的圆形菜单 秒秒钟高仿建行圆形菜单
  15. linux non-iso extended-ascii,Linux 下文件Non-ISO extended-ASCII编码问题
  16. 备份 mysql 数据库
  17. 开始读《C专家编程》
  18. 服务器千兆网卡显示百兆,windows10系统查看网卡是千兆还是百兆的方法
  19. 我爱你,没有什么目的:情感日志
  20. openzeppelin

热门文章

  1. 肥鲨HDO和HD3买哪个?
  2. matlab机器人工具箱 轨迹生成函数jtraj代码详解
  3. 双十一第二波活动来了,酷客scrm助力商家大卖
  4. Attention概述
  5. 几个免费好用的IP查询接口
  6. 签名证书(.keystore)生成指南
  7. labuladong 公众号的使用方法
  8. 深信服网络挑战赛初赛_2019
  9. Ai智能对话页面html,js人工智能对话框 - osc_q50is30g的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. VLOOKUP函数 table_array:无效引用