字符串匹配查找算法总结

简介: 字符串匹配查找算法总结

描述

字符串匹配查找常见的算法或数据结构有:暴力搜索、KMP算法(Extend-KMP、BM算法、Sunday算法)、AC自动机、前缀树(Double Array Trie)、后缀树(后缀数组)。 以下汇总它们的算法比较,以及关键点:

关键点描述

KMP算法

模式串需要移动的距离=模式串已匹配的字符长度-(模式串已匹配字符串)前缀后缀最长公长度

next数组(前缀后缀最长公长度)求解:N为next数组,i为数组位置,P为模式串

  • 1、当i=0,N[0]=0
  • 2、当i=1,如果P[1]=P[0],N[1]=N[0]+1; 否则N[1]=N[0]
  • 3、当i=j,如果P[j]=P[N[j-1]],N[j]=N[j-1]+1;
    否则,i=N[j-1],如果i>0,重复上述计算,否则,N[j]=0

AC自动机

  • 1、为模式串建立Trie(标志模式串的节点特殊标记,用于匹配时确认匹配成功)
  • 2、为Trie建立Fail(失败)指针(在匹配路径上失败的时,跳转到合适的位置进行下次匹配)
  • 3、对字符串进行匹配(遍历Trie,进行匹配)

Fail指针的建立:对于一个节点C,标识字符a,顺着C的父亲节点的失配指针走,走到第一个有儿子也是a的节点D,那么C的失配指针就指向D的标识a的儿子节点(假设为E,从根节点到E节点表示的模式串P2是从根节点到C节点的字符串的后缀P1的后缀,当模式串P1匹配失败时,尝试匹配模式串P2,这是Fail 指针的本质作用)。 如果找不到这个节点,那么失配指针指向Root

Ukkonen后缀树算法

活动节点:是用于查找一个后缀是否已经存在这棵树里,即查找的时候从活动节点的子节点开始查找,同时当需要插入边的时候也是插入到该节点下;

活动边:是每次需要进行分割的边,即成为活动边就意味着需要被分割; 而 活动长度 则是指明从活动边的哪个位置开始分割。

剩余后缀数:是我们需要插入的后缀的数量,说明程序员点就是缓存的数量,因为每次如果要插入的后缀存在,则缓存起来。

活动点(active point) :三元组(活动节点,活动边,活动长度)

后缀连接:如果一个步骤插入(Insert)两个以上新的节点,如果该新节点不是当前步骤中创建的第一个节点,则将先前插入的节点与该新节点通过一个特殊的指针连接,称为后缀连接(Suffix Link)。 后缀连接通过一条虚线来表示,连接由前一个节点指向后一个节点。 从根节点到达后缀连接指向节点的字符串,是从根节点到达后缀连接源节点的字符串的后缀。 所以后缀连接的前一个节点需要分割时,需要同时分割后缀连接指向的节点。

代码实现

(未完待续)

参考文档

后缀树: http://www.cnblogs.com/gaochundong/p/suffix_tree.html


Ukkonen 的后缀树算法的清晰解释: http://www.oschina.net/translate/ukkonens-suffix-tree-algorithm-in-plain-english


Aho-Corasick自动机浅析: https://segmentfault.com/a/1190000000484127


AC自动机算法: http://m.blog.csdn.net/article/details?id=7002823


从头到尾彻底理解KMP算法: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html


从头到尾彻底理解KMP算法: http://blog.csdn.net/v_july_v/article/details/7041827

本文作者 : cyningsun

本文地址https://www.cyningsun.com/04-10-2016/string-match.html

版权声明 :本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0 CN 许可协议。 转载请注明出处!

目录
相关文章
|
4月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
2月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
96 1
两个字符串匹配出最长公共子序列算法
|
4月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
5月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
307 1
|
5月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
135 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
4月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
87 0
|
6月前
|
存储 算法 Cloud Native
C++ bcrypt算法 字符串加密,亲测有效
C++ bcrypt算法 字符串加密,亲测有效
|
6月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
5月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
7月前
|
算法
KPM算法求字符串的最小周期证明
公式 `ans = n - LPS[n-1]` 描述了最小周期,其中 `n` 是子串长度,`LPS[n-1]` 是前缀函数值。证明分为特殊情况和一般情况:对于完整周期字符串,`LPS[n-1] = 3*T`,故 `ans = T`;对于非完整周期,通过分析不同长度的 `[末部分]` 和 `[前部分]`,展示 `ans` 始终等于周期 `T` 或由 `[e][b]` 构成的最小周期,从而证明公式正确。