kmp算法小记

       最近学习了下kmp算法,这个算法在String中查询包含的String的效率很高,后续也有可能需要回忆和使用,这里记下自己学习后的使用心得。

        一般情况下,我们查找一个长字符串(这里称该字符串为target)中是否包含某字符串(这里称该字符串为client),那么我们必须要遍历target,通过char的持续对比,如果在一个对比阶段,发现完全匹配,那么就可以判断target包含client。但是这样效率就太低了为O(m*n),而kmp的效率为O(m+n),那么kmp是如何提高效率的呢?在对比过程中target肯定是要遍历一遍的,这个是没办法避免的。那么只有从client中想办法了。

        kmp通过预先分析client的规律,如果client符合某种规律,那么就有可能提高查找效率。当然如果client为“absdtf”这种的话,那么kmp效率和普通的查询就一样了。但是如果client为“ababc”或者“abcca”这种存在重复字符或者存在重复字符段的字符串,就可以提高查询效率。

        kmp算法中最重要的就是找出client的规律,并通过next数组把这个规律记载下来。我们先把client设为“abababc”来进行分析。对应的next数组为{0,0,1,2,3,4,0}。

next数组

         那么这个数组是怎么生成的呢?

        client分为前缀和后缀(这里前缀和后缀必须相同),前后缀的最长长度即为最后1个字符对应的next数组的数值。如下图分析不同长度的字符串,可以得到不同的next值。

next最后一位计算

          现在虽然我们通过眼测,把这个next的出来了。如果死板硬套,算出这个next数组,其实也没啥意义,因为这个next数组的生成方法才是kmp的算法的精髓。那么kmp是如何计算出来的呢?我现在一步步给你讲解。

        ab这个数组不存在前缀后缀,也就不用说。如下:

无前后缀

        aba的数组如下:

前后缀为ab

       这里第三个a的next值(a对应的next数组值)变成了1,这个1指这个aba的前后缀长度为1。如果增加一位abax(这里定义x为未知字符),那么这个x对应的next的数值为多少呢?

前后缀未定,有50%可能为ab

      假前缀为(ab),加后缀为ax,如果x为b,那么前后缀都变为真的了。而b位于client中的位置正好等于第二个a的next值。

        按我理解,这个x必须与b对比,而b位于字符串client中的位置正好和a的next值相同,为1。那么我们可以这么理解:a的next值为标记tag,x字符必须与client中排序为tag的字符对比。

注意字符b的序号和a的next值

       如果x==b的话,x的next值为前后缀的长度 + 1,也就是a的next值 + 1。而x的next值生成成功,并且为即将到来的下一位字符做好了准备。


      如此,你去查看“abababc”的next值{0,0,1,2,3,4,0},是不是都可以这么解释?


       那么当x与前缀结尾对比,不相等这种情况,如何解释呢?查看下面这个字符串,当x与前缀的缀尾字符不相同时,那么x必须与前缀的前缀缀尾进行对比。也就是以对比字符的next值为标记tag,x字符必须与client中排序为tag的字符对比。通过一次次对比,一直往前面跨越推进,如果都不存在,当前缀尾的next值就为0。

        那么按照这种理解,编写next的生成代码,如下:

        理解了next生成,其实kmp的实现跟next计算的方式差不多,如下:

kmp算法的复杂度,client和target都遍历了一遍,即为O(m+n)。

后续还会回顾这篇文章,如果你有看到这篇文章,并且对我的理解有异议,请提出,非常谢谢。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 字符串匹配KMP算法详解 1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有...
    张晨辉Allen阅读 2,382评论 0 3
  • 数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章、这篇文章、还有这篇他们写得非常...
    sunhaiyu阅读 1,722评论 1 21
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 3,043评论 0 7
  • 若我们的共鸣体不曾被发现 是不是也就不会有 那么多空想杂念 徘徊在人群边缘 在夜里书写秘密的想念 若我们的感情脆弱...
    JJJaeL阅读 247评论 0 1