结合双数组Trie的AC自动机算法
结合双数组Trie的AC自动机算法是一种相对比较快的词匹配算法,常见于分词系统用于分词,本文准备用伪代码结合实例的形式来讲解一下该匹配算法的实现原理
构建步骤:
1.Trie树的构建
首先直观感受一下Trie树:
插入模式串 ball、bat、doll、dork、dorm、do、send、sense之后形成的trie树
trie树分三步:插入(构建)、查找、删除
插入:
1.输入一个模式串 String 2.如果该模式串已经存在于树中,则跳转 8.如果不存在,跳转3 3.设置当前节点为根节点 4.对String的每一个字符i循环: 判断当前节点的子节点是否存在此字符,如果存在,则设置当前节点为该节点的子节点;否则创建一个新节点,该节点所对应的字符为String的当前字符;
i = i+1
记录当前字符所经过的模式串的数目为原始数目加一;
5.记录结尾字符为结束字符
6.end
查找
1.输入一个字符串 String 2.设置当前节点为根节点; 3.循环字符串String的每一个字符i: 如果String的当前字符为最后一个字符,同时节点判断为end节点,则跳至 步骤4;如果节点判断为非end节点,则跳至步骤5; 如果String字符串的下一个字符为当前节点的子节点,则将当前节点设置为当前节点带有i字符的子节点;如果不存在 跳至步骤5; i=i+1; 4.返回 成功 5.返回 失败 6.end
删除
1.输入删除字符串String 2.搜索该字符串,如果不存在,则跳至节点4 3.设定当前节点为root节点 3.对于String的每一个字符i: 如果字符i为root节点的子节点(必然是,已经搜索过了),判断如果当前count=1;移除该节点;跳至5; 判断当前节点,如果i为end节点,将当前节点的最终节点属性设为false跳至5; 如果当前节点count>1,将当前节点的count-1,将当前节点的字符i的子节点设为当前节点 i=i+1 4.返回失败 5.返回成功 6.end