串的模式匹配算法

作者: KenZhangCn | 来源:发表于2017-06-12 12:12 被阅读39次

在代码中的模式匹配往往都是写好的接口, 基本上只需要用一句代码可以实现.


匹配字符串中的子字符是如何实现的呢? 假设我们以 S 代表目标串,即父串(例如 aeaaefababdc), 以 T 代表模式串即子串(例如 abd), i 代表 S 中字符位置, j 代表 T 中字符位置, 即下标. 我们要做的是匹配是否 abcdefabdc 中存在 aeaad.

  • 最常用的是使用朴素匹配算法
    朴素匹配算法的原理是使用模式串 T 和目标串 S 的每一个字符都进行比较, 是一种有回溯的算法. 算法的时间复杂度无 O(m+n), m,n 分别代表目标串和模式串的长度.
    1 首先我们令 i = 0, j = 0.
    2 把 S 的第一个字符 S[0] 和 T 的第一个字符 T[0] 进行比较. (例子中 S[0] = T[0] = a)
    3 如果相同则 i, j 分别+1 . (例子中 继续比较 S[1] 和 T[1], S[1] = T[1] = b)
    4 直到出现不相同S[i] != T[j]. (例子中 S[4] = e != T[4] = d)
    5 重新比较 S 的第二个字符 S[1] 和 T 的第一个字符 T[0] , 重复执行步骤3,4直到匹配成功或所有都匹配不成功.
  • KMP 匹配算法
    在许多时候, 朴素算法的回溯增加了大量的运算时间, 特别是当模式串和主串有许多部分匹配的情况下. 因此 D. E. Kunth 与 J. H. Morris 和 V. R. Pratt对算法做出了改进, 使得算法不需要回溯, 并且可以在 O(m+n)的时间复杂度上完成串的匹配, 称为 KMP 匹配算法.
    KMP 匹配算法相对朴素匹配算法的改进之处在于, KMP 匹配算法会对匹配串本身进行一次匹配, 目的是为了当匹配串和目标串"失配"时, 确定模式串中和需重新和主串中的"失配"那一位字符进行比较的位置. 即模式串的 next[j] 函数.
    1 首先我们令 i = 0, j = 0.
    2 把 S 的第一个字符 S[0] 和 T 的第一个字符 T[0] 进行比较. (例子中 S[0] = T[0] = a)
    3 如果相同则 i, j 分别+1, 继续比较 S[1] 和 T[1]. (例子中 S[1] = T[1] = b)
    4 直到出现不相同S[i] != T[j]. (例子中 S[2] = c != T[2] = d)
    5 模式串 T 退回到 next[j] 指示位置与 S 失配位置 S[i] 进行比较. (例子中next[j] = 2, 对比S[4] = e 和 T[2] = a, 从而跳过了 S[1] - S[3] 以及 T[0] 和 T[1] 的比较.)
    6 重复3,4,5直到匹配成功或所有都匹配不成功.
  • 虽然 KMP 匹配算法无需回溯, 但是仅有当模式串和主串有许多部分匹配的情况下在时间复杂度上有明显的优势. 又因为朴素匹配模式算法在一般情况下执行时间近似 O(m+n), 因此朴素匹配模式算法仍在被大量采用.

相关文章

  • 一些有关算法的

    字符串模式匹配算法 字符串的KMP算法详解部分匹配表(即)向右移一位就可以得到next数组。字符串模式匹配算法 R...

  • 数据结构与算法学习 (08)字符串匹配--BF算法/RK算法

    BF算法也就是串的模式匹配算法,在主串中查找与模式T(副串)相匹配的子串,如果匹配成功,找到该子串在主串出现的第一...

  • 字符串匹配算法总结

    字符串匹配算法总结 所有代码集合 在一个主串中匹配模式串 BF算法   最简单的使用strcmp逐个匹配的算法, ...

  • AC自动机

    字符串匹配算法 单模式串匹配算法 是在一个模式串和一个主串之间进行匹配,也就是说,在一个主串中查找一个模式串。 多...

  • 字符串匹配的KMP算法

    算法概述 算法主要用于子串的定位,即串的模式匹配。 算法的心路历程 字符串匹配举例一:文本串S=“abcdefga...

  • 《大话数据结构》笔记一(基础)

    1 数据2 算法3 线性表4 栈5 队列6 串朴素模式匹配算法 -子串的定位操作:从主串中找到子串KMP模式匹配算...

  • 字符串匹配算法

    场景:字符串A为主串,字符串B为模式串,比较字符串B是否能够在字符串A中进行匹配? 匹配算法:BF算法和RK算法。...

  • 字符串匹配算法

    KMP算法 算法介绍 KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。...

  • 字符串的模式匹配(BF算法与KMF算法)

    串的模式匹配 1.朴素的模式匹配(Brute-Force)算法 Brute-Force算法的实现: 测试程序以及运...

  • KMP算法讲解

    KMP 算法 : 模式匹配算法 主要应用于 字符串的匹配。9月21日更新

网友评论

    本文标题:串的模式匹配算法

    本文链接:https://www.haomeiwen.com/subject/fvefqxtx.html