当前位置: 主页 > JAVA语言

模式串匹配 java-分布式AC的三个函数AC自动机包含了3个核心函数

发布时间:2023-07-16 16:04   浏览次数:次   作者:佚名

前言

常常会遇到一类需求,在一段字符串中查找全部能匹配上的模式,好比查找一段文字匹配上字典中哪些短语。这时为了高效处理,就会考虑 AC 自动机,即 Aho-Corasick 自动机算法。它的核心思想是经过有限自动机巧妙地将字符比较转化为了状态转移。java

经过 AC 自动机能作到匹配时不须要回溯模式串匹配 java,并且时间复杂度为 O(n),即时间复杂度与词典的规模无关。git

暴力匹配

暴力匹配就是一个一个比较,将模式串从头至尾匹配主串字符串,以下图模式串"ABCE"比较主串,一旦遇到不相同的则日后移觉得,从新开始比较,直到比对完主串,接着第二个模式串继续比较。该方法简单暴力,很好理解,但时间复杂度高,O(mn)。github

串匹配问题_模式串匹配 java_实现串的模式匹配算法

image

AC自动机

AC自动机主要是将 n 个模式串构建成一个肯定性的树形有限状态机,而后将主串做为该有限状态机的输入,使该状态机进行状态的转换,当到达某些特定的状态时则说明发生模式匹配。算法

串匹配问题_模式串匹配 java_实现串的模式匹配算法

经过例子来理解,以 he、she、his、hers 为模式串,ushers为主串,构成了以下的状态机。bash

image

在状态机内部,能够看到有实线和虚线箭头,优先以实线标明方向转换状态,当没法实线转换时才使用虚线转换。并发

串匹配问题_模式串匹配 java_实现串的模式匹配算法

另外,当转换到图中红圈位置时说明发生了模式匹配,好比对于he,从根节点到1再到2,此时符合he,说明发生了模式匹配。机器学习

根据上图你能够试试看ushers会匹配出哪些模式,而且比划下状态的转换过程。分布式

AC的三个函数

实现串的模式匹配算法_串匹配问题_模式串匹配 java

AC自动机包含了三个核心函数,基本上理解了他们就搞懂AC了。函数

image

image

串匹配问题_模式串匹配 java_实现串的模式匹配算法

image

实现

实现AC自动机时通常都会用TRIE树结构模式串匹配 java,那么就会定义一个ACTrieNode类,包含了子节点、值、output、failure节点等等属性。学习

public class ACTrieNode {
	private ACTrieNode[] children;
	private byte[] value;
	private boolean deleted = false;
	private int status;
	private ACArray[] results = null;
	private ACTrieNode failureNode;
	private static String encoding = "utf-8";
}
复制代码

详细实现看github,。