From: http://hi.baidu.com/absolute8511/blog/item/b576e1c8df5235107e3e6ffc.html
字符串搜索或匹配是经常用到的技术,因此也发展了多个算法,介绍几个著名的算法。
1.单模式匹配
就是在一些文本中查找某一个子字符串的算法,效率较高的有以下几种。
KMP算法:全称Knuth-Morris-Pratt算法 预处理时间Θ(m) 匹配搜索时间 Θ(n)
BM算法:全称Boyer-Moore string search algorithm 预处理时间Θ(m + |Σ|) 匹配搜索时间Ω(n/m), O(n)
2. 有限模式集合匹配
就是在字符串中查找多个子字符串的算法,常用于查找字典中的单词和一些脏字匹配算法
Aho-Corasick算法:这是一种字典匹配算法,它用于在输入文本中查找字典中的字符串。时间复杂度是线性的。
基本原理:该算法利用类似后缀树的方法构造一个trie结构,匹配时利用该结构来搜索。
Commentz-Walter 算法:详细未知
Rabin-Karp string search算法:该算法最差复杂度不好,因此运用的并不广泛。
以上资料来源于维基百科,感兴趣的可以搜索维基百科词条String searching algorithm以获取更多信息。
=============================
字符串多模匹配算法之AC自动机理解心得
absolute8511 总结于 2009-2-26
AC自动机算法全称Aho-Corasick算法,是一种字符串多模式匹配算法。用于在一段文本中查找多个模式字符串。最近看到这个算法的一些文章,由于理解能力有限,琢磨了许久才有一些眉目,故记下此时的理解过程,防止过久了又要琢磨许久才能理解,也希望能帮助其他人加深理解,如有理解不当之处还望指出修正。^_^
总结如下:
该算法有两个主要步骤,一个是字典树的构造,一个是搜索路径的确定。
1. 字典树的构造
这个比较好理解,就是把要匹配的一些字符串添加到树结构中去,树边就是单词中的字符,单词中最后一个字符的连接节点添加标志,以表示改节点路径包含1个字典中的字符串,搜索到此节点就表示找到了字典中的某个单词,可以直接输出。
例子:某字典P={he,she,his,hers}对应的字典树如下图:
图中有数字的节点到根节点的路劲正好对应字典中的字符串,数字表述单词在字典中的顺序,也可以是其他标志。
【转载请注明出处:http://hi.baidu.com/absolute8511/blog/item/73ffcbf293d86e14b17ec5e9.html】
2. 搜索路径的确定
就是这部分我琢磨了很久,我的理解是 利用后缀字符串来确定。后缀字符串就是某个字符串的后面的一部分。比如abcde的后缀字符串有bcde,cde,de和e。
假定目标字符串为ushers,字典为上图所示。
搜索过程目标字符串指针指向的字符和字典中的字符会有以下几种情况:
a. 当前字符匹配,表示从当前节点沿着树边有一条路径可以到达目标字符,此时只需沿该路径走向下一个节点继续匹配即可,目标字符串指针移向下个字符继续匹配;
如:当指针指到s处,此时字典树指针处于根,要从根到s处,可以看到图中有一条从根经s连接到的节点,因此字典树节点指针指向此节点,目标字符串指针移动到下一字符h继续匹配;显然当前节点有一条经h连接到的节点,于是重复操作到有数字标志的节点2处,表示已找到,该匹配字符串就是"she",输出该字符串的位置后,目标字符串指针增1指向"r",字典指针指向数字2节点,进行下次匹配。
b. 当前字符无匹配,表示当前节点的任何一条边都无法达到要匹配的字符,此时不能沿现有路径前进,只能回溯,回溯到存在的最长的后缀字符串处,如果没有任何后缀字符串匹配则回溯到树根处。然后从当前回溯节点判断是否可以到达目标字符串字符。
如:接上,由于数字2节点无经"r"的连接,因此回溯,she的后缀字符串he在字典树中,因此字典树指针指向带有数字1的标志节点,由于带有标志,直接输出该节点"HE"(存疑,很多文章没有提到此处需要输出,正常路径移动的字典指针节点要判断是否可以输出,那么由回溯路径改变的字典指针指向的节点要不要判断是否输出?),然后从数字1节点判断是否有经"r"到下一节点的路径,显然图中有。因此字典树节点指向下一节点,重复以上操作,最后找到"hers",此时匹配搜索也结束了。
以上两种情况直到目标字符串指针直到末尾结束匹配。在匹配过程中遇到有标志的节点说明找到了字典中的某个词,可以直接输出。
更新:输出说明:每次目标串指针移动前都需要判断当前节点是否可以输出,并递归的判断当前节点回溯路径上的节点是否可以输出(其实就是判断所有后缀字符串,she匹配时,其后缀he也会匹配,即使she不匹配,其后缀he也可能匹配,因此需递归判断后缀字符串),直到树根结束递归。
由于固定字典的字符串的后缀字符串都是已知的,因此可以在字典树结构中存储匹配失败的路径方向,因此只要字典树构造完毕,就可以根据字典树的路径进行匹配了,效率非常快。以上就是我对该算法的全部过程的理解,疏漏之处在所难免。
附1:含匹配失败的情况的路径选择的字典树,实线表示匹配成功的正常路径,虚线表示失败的回溯路径
附2:伪代码实现
T为目标字符串,长度为m,q为字典树的节点指针,g函数返回从节点q经过路径T[i]到达的下一节点指针,f函数返回节点q的回溯节点指针。flag判断节点是否为标志节点
q := 0; // initial state (root)
for i := 1 to m do
while g(q,T[i]) = NULL do
q := f(q); // 回溯
q := g(q,T[i]); // 前进
node:=q;
while(node!=root){
if flag(node) exist ; then print i, out(node);
node = f(node); //查找回溯节点
}
endfor;
参考资料:Biosequence Algorithms, Spring 2005 Lecture 4: Set Matching and
Aho-Corasick Algorithm. Pekka Kilpelainen
【转载请注明出处:http://hi.baidu.com/absolute8511/blog/item/73ffcbf293d86e14b17ec5e9.html】
关键词:AC多模式字符串匹配算法,字符串搜索,查找字典中出现的字符串,字符串多模式匹配算法,多个字符串查找
分享到:
相关推荐
这个压缩包“常用字符串算法集合(c++)”包含了一些经过编译验证的示例代码,旨在帮助学习者掌握常见字符串算法的实现。以下是一些可能涵盖的知识点: 1. **字符串基本操作**:C++标准库中的`std::string`类提供了...
在Delphi中实现字符串压缩,我们可以使用各种开源库或自定义算法。其中,最常用的压缩库之一是ZLib,它是一个跨平台的压缩和解压缩库,提供了多种压缩算法,如Deflate和Gzip。要使用ZLib在Delphi中压缩字符串,首先...
- 对于效率,可能需要考虑优化算法,比如预计算进制幂表,避免重复计算,或者使用更高效的字符串处理方法。 7. **内存管理与安全性**: - 确保在处理字符串时避免内存泄漏,使用智能指针或其他内存管理策略。 - ...
9. **字符串处理**:如模式匹配(KMP、Boyer-Moore)、字符串排序、最长公共前后缀等,这些在文本分析、搜索引擎等方面非常重要。 10. **计算几何**:包括点线段关系判断、多边形碰撞检测、最近点对查询等,这些...
8. **字符串处理**:KMP算法、Rabin-Karp算法、Z函数等字符串匹配算法,以及Manacher's Algorithm等字符串处理技巧,在文本处理和模式查找中有着广泛的应用。 9. **递归与分治**:分治法(如快速幂、归并排序)和...
- **Z算法**:另一种字符串匹配算法,可以找出所有子串的起始位置。 6. **数据结构** - **栈和队列**:C++中可通过`std::stack`和`std::queue`实现。 - **链表**:包括单链表、双向链表和循环链表,常用于数据...
6. **字符串处理**:KMP算法、Boyer-Moore算法、Rabin-Karp算法等用于字符串匹配,以及Z算法、Manacher's算法用于找到字符串中的最长回文子串。 7. **递归与分治**:如快速幂、大整数乘法、归并排序、汉诺塔等问题...
8. **字符串处理**:如KMP匹配算法、Rabin-Karp字符串搜索算法等,用于处理字符串的比较和查找。 9. **数值计算与近似算法**:如牛顿迭代法、二分法等,这些方法常用于求解数学问题。 10. **位运算**:C语言中的位...
6. **字符串处理**:C语言中的字符串处理涉及到字符串的比较、复制、反转、查找子串等操作,这些在实际编程中非常常见。 7. **数学算法**:如欧几里得算法求最大公约数、费马小定理、快速幂运算等,这些算法不仅...
6. **字符串处理**:如KMP算法、Boyer-Moore算法等,用于高效的文本匹配;还有动态规划解决的最长公共子序列问题,在生物信息学等领域中有重要应用。 7. **递归与回溯**:递归是解决复杂问题的有效工具,但需注意...
8. **字符串处理**:KMP算法、Boyer-Moore算法等用于字符串匹配,Z-Algorithm、Rabin-Karp算法用于模式查找,这些都是文本处理中的核心算法。 9. **递归与分治**:如归并排序、快速排序、分治法求解问题(如Master ...
本教程主要关注的是易语言中的字符串处理,特别是rot13加密算法的实现。 rot13(旋转13位)是一种简单的字符替换加密方法,它对字母进行对称加密,即每个字母被替换为其在字母表中向后移动13位的字母。如果超过字母...
6. **字符串处理**:KMP算法用于模式匹配,Rabin-Karp算法用于字符串搜索,Z函数和Manacher's算法用于找到字符串中的最长回文子串。 7. **数据结构**:链表、栈、队列、树(如二叉搜索树、平衡树AVL和红黑树)、...
7. **字符串处理**:C语言中的字符串处理也是重要的一部分,可能包含KMP算法、Boyer-Moore算法等字符串匹配方法,以及Rabin-Karp、Z算法等字符串搜索技术。 8. **数值计算与模拟**:书中可能包含线性代数、数值积分...
5. **字符串处理**:KMP算法、Boyer-Moore算法、Rabin-Karp算法用于字符串匹配,Z函数和Manacher's Algorithm用于找出字符串的最长回文子串。在ACM竞赛中,字符串处理问题经常出现,掌握这些算法至关重要。 6. **...
Base64加密算法 Base64加密算法是一种常用的编码方式,广泛应用于互联网、...Base64加密算法是一种广泛应用于互联网和网络通信领域的编码方式,它能够将二进制数据转换为可读的ASCII字符串,以便于数据交换和存储。
5. 其他算法:如字符串匹配算法(KMP、Boyer-Moore)、哈希函数、贪心算法、分支限界法等,这些在特定场景下能提供高效解决方案。 6. 设计模式:源码包可能还包括一些经典的软件设计模式,如工厂模式、单例模式、...
6. **字符串处理**:包括KMP算法、Boyer-Moore算法等字符串匹配方法,以及Z函数、Manacher's算法等字符串处理技巧。 7. **图论算法**:Dijkstra's单源最短路径算法、Floyd-Warshall所有对最短路径算法,以及Ford-...
常用算法:1. 数组与链表;2. 栈与队列;3. 树与图;4. 动态规划与贪心;5. 字符串与哈希表;6. 回溯与分治;7. 排序与搜索;8. 位运算与数学计算;
8. **字符串处理**:KMP算法、Rabin-Karp算法用于字符串匹配,Z算法、Manacher's算法处理回文串问题。 9. **数据结构**:链表、栈、队列、堆、哈希表等基础数据结构的理解和操作是面试必备,如双端队列、优先队列、...