Code前端首页关于Code前端联系我们

什么是KMP算法(Knuth-Morris-Pratt字符串搜索算法)?

terry 2年前 (2023-09-27) 阅读数 62 #数据结构与算法

作者:程序员和吴师兄

KMP算法内部涉及太多数学原理和知识。本文仅描述KMP算法的工作过程以及部分匹配表,下面介绍的数组❀。如果你明白了这三点,再看看其他关于KMP算法的文章,你一定会明白的。

请阅读以下文字说明并搭配视频动画~ 花七分钟了解KMP算法。 Prat字符串搜索算法,简称为KMP算法,通常用于查找文本字符串中模式字符串P的出现。该算法由S.m联合发表。由唐纳德·Knuth、沃恩·Pratt和詹姆斯·H·Morris于 1977 年提出,因此该算法以这三个人的姓氏命名。

唐纳德·Knuth这个名字听起来熟悉吗?没错,他还出现在之前的文章,这可能是解释Knuth洗牌算法最好的文章!下面直接给出

KMP算法的工作过程:

  • 我们假设文本字符串S与位置i和模式字符串 P

的位置相匹配。 j = -1 即当前如果字符匹配成功(即S[i] == P[j]),则继续匹配下一个字符i++、j++;
如果 j != -1 并且当前字符匹配失败(即 S[i] != P[j]),则让 i 保持不变,j = next[j]。这意味着,如果存在不匹配,则模式字符串 P 相对于文本字符串 S 向右移动 j -

  • 的下一个 [j] 位。换句话说,模式串P的不匹配位置的下一个数组的值与模式串P匹配。索引位置被移动到不匹配的位置
  • 你不明白吗?现场观看动画!

    Running process

    Take the following image text string S and pattern string P as an example: 什么是KMP算法(Knuth-Morris-Pratt 字符串查找算法)?

    First list all substrings of pattern string P:

    a

    acaabababaababababababababa Then get all每个子串的前缀和后缀。前缀

    指的是字符串中除最后一个字符之外的所有主要组合; 后缀指字符串中除第一个字符之外的所有尾部组合。

    以第五列为例进行演示。

    前缀

    aababaaba

    后缀后缀♷❀ ab

    因此该前后缀公共元素的最大长度是。

    获取原始模式串P 的子串对应的每个前缀和后缀的公共元素 的最大长度表,如下所示。 什么是KMP算法(Knuth-Morris-Pratt 字符串查找算法)?

    根据最大长度表,找到以下数组xm相当于“最大xm”。将整数右移一位,然后将初始值设置为 -1 什么是KMP算法(Knuth-Morris-Pratt 字符串查找算法)?

    好了,拿到下一个数组后,KMP算法的工作原理就很清楚了。

    将模式序列 P 的字母与文本字符串 S 一一匹配。如果不匹配,模式字符串会向右移动。

    如何移动? 什么是KMP算法(Knuth-Morris-Pratt 字符串查找算法)?

    例如,b 与文本字符串 c 不匹配。在模式字符串的下一个数组中查找不匹配的处的匹配值,这里是0,然后将索引为0的位置移动到不匹配的位置。 什么是KMP算法(Knuth-Morris-Pratt 字符串查找算法)?

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    热门