介绍:《柔性字符串匹配 Flexible Pattern Matching in Sortings》是一本不可多得的字符串匹配方面的专业书籍。书中对串匹配问题进行了系统化的分类,从实际效果出发,着重详细介绍了串匹配领域内效果最好的若干种算法。
1.单模式匹配
算法的思想越简单,实际应用的效果越好。
- KMP(Knuth-Morris-Pratt)和BM(Boyer-Moore)算法是串匹配中最古老和最著名的。
- KMP在实际应用中比蛮力方法还要慢一倍。
- BM系列算法中,应用最成功的算法是对原始算法进行高度简化后得到的Horspool(比BM快)。
- 实际应用中如果模式串p足够长,则BOM是最快的,而如果p足够短,则BDM的更简单、更有效版本BNDM会比较好。
2.多模式匹配
大部分但模式匹配算法都能扩展到多模式匹配。
- Aho-Corasick是KMP向多模式串情形的扩展,该算法对应的数据结构是Aho-Corasick Automation,即AC自动机。
- Horspool的多模式匹配扩展是Set Horspool,当搜索一个很大字母表上的一个较小模式串集合时,其效率很高。
- Wu-Manber算法结合了后缀搜索算法和散列方法,在实际应用中效率很高。
- BOM的多模式匹配扩展是SBOM,当模式串集合中的最小模式串长度较大时,SBOM算法效率很高。
3.正则表达式
NFA (Nondeterministic Finite Automaton)
DFA (Deterministic Finite Automaton)
- DFA是正则表达式搜索中所采用的经典算法之一,称为DFA Classical算法。但它的主要问题是把NFA转换成DFA后,DFA的大小可能是原来NFA大小的指数级,因此,只是在模式串长度较短时才适用。
- 对于较长的模式串,通常适用多个较小的DFA构造一个大的NFA,这种结合适用NFA和DFA的方法具有较好的效率,称为DFA Modules算法。
闲话:看这本书最初是因为最近要做一个网站关键词过滤的功能(关键词高亮或者关键词替换为*号),后来经过各种取舍之后,决定采用AC自动机来做(能力有限,这个比较简单)。于是先用关键字字典(模式串集合)建立一个AC自动机(其实就是增加了fail指针的Trie树),每次匹配时用它去匹配就好了。