AC自动机 - 关于Fail指针

本文通过实例详细解释了AC自动机中fail指针的工作原理。以he hers his she为例,展示了如何构建fail指针,并说明了其在模式匹配过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fail指针可以说是AC自动机里最难理解的东西,怎样更好的理解AC自动机的fail指针?

先来看一幅图:

看这幅图上的fail指针是怎么构造的.

树上的词分别是:

{ he , hers , his , she}

按图所示分成3层。看到第三层,是"she",其中:

①s指向root

②h先找到s的fail指针

发现是0号指针,不是h,然后h就不高兴了,再问问s的fail指针root:“你有没有儿子和我同名叫h的”

root说:“有,你指向他吧”,然后h就高兴的指向了第一行的h.

③e开始找了,首先问他老爸h:“你的fail指针指着谁”

h说:“图上第一行那个h啊”

然后e就屁颠屁颠地跑去问图上第一行那个h:“你有没有名字和我一样的儿子啊”

图上第一行那个h说:“有,他地址是xxx”

最后e的fail指针就指向xxx地址,也就是第一行那个e了

发现这样,如果一个字符串查到第三行的e以后的字符才不匹配,那说明他前面应该有个‘he’

刚好e的失败指针指向的是第一行的‘he...’的那个e;

这样就不用从h开始再找一遍,而是接着第一行的e继续往后找,从而节省了时间.

--------------------------------------------------------- End.

转载请注明:http://www.cnblogs.com/crazyacking/p/4659501.html 

### AC自动机 `get_fail` 函数的作用 在AC自动机中,`get_fail` 函数主要用于计算并设置每个节点的失败指针fail pointer)。这些失败指针对于加速模式匹配至关重要。当某个字符未能成功匹配当前节点时,程序可以通过该节点指向的失败指针跳转至另一个可以继续尝试匹配的状态。 具体来说,失败指针帮助实现了从一个状态快速转移到下一个最有可能成功的状态,而无需重新开始整个搜索流程。这种机制显著提高了多模式字符串匹配算法效率[^1]。 ### `get_fail` 函数的具体实现 下面展示了一个简化版的 Python 实现方式: ```python from collections import deque def build_ac_automaton(patterns): root = {'children': {}, 'fail': None, 'output': []} # 构建Trie树 (前缀树) for pattern in patterns: node = root for char in pattern: if char not in node['children']: node['children'][char] = {'children': {}, 'fail': None, 'output': []} node = node['children'][char] node['output'].append(pattern) queue = deque() root['fail'] = root # 初始化第一层子节点的 fail 指针 for child_char, child_node in root['children'].items(): child_node['fail'] = root queue.append(child_node) while queue: current_node = queue.popleft() for next_char, next_node in current_node['children'].items(): temp = current_node['fail'] while temp is not root and next_char not in temp['children']: temp = temp['fail'] if next_char in temp['children']: next_node['fail'] = temp['children'][next_char] else: next_node['fail'] = root next_node['output'] += next_node['fail']['output'] queue.append(next_node) return root patterns = ["he", "she", "his", "hers"] root = build_ac_automaton(patterns) def get_fail(node): """获取指定节点的失败指针""" return node.get('fail') ``` 此代码片段展示了如何通过广度优先搜索(BFS)初始化所有非根节点的失败指针,并将其存储于字典形式的数据结构之中。每当创建一个新的孩子节点时,都会为其分配相应的失败指针;而对于更深层次的孩子节点,则依据父级节点及其关联关系来决定具体的失败路径[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值