DFA 学习笔记

好神奇的东西。

1. 定义

DFA 即 确定有限状态自动机,它由以下五部分组成:

  • 字符集 \(\Sigma\)。它代表了 DFA 中允许存在的字符。
  • 状态集合 \(Q\)。它代表了 DFA 中的 所有状态,即这个有向图中的节点。
  • 起始状态 \(st\)。它代表了 DFA 中的 一个状态,即有向图的起点。
  • 终止状态集合 \(F\)。它代表了 DFA 中的 若干个特殊状态
  • 转移函数 \(\delta\)。它记为 \(\delta(i, c)\),接受两个参数 \(i\)\(c\),其中 \(i \in Q, c \in \Sigma\),返回一个参数 \(j\),其中 \(j \in Q\)。你可以将它理解为有向图中的带权边。

2. 对信号的判断

我们将字符串视为一个信号,那么 DFA 可以对这个字符串(信号)进行判定。

向 DFA 输入一个字符串后,DFA 会返回 接受 或者 不接受 两种状态中的一种。具体地,如果按照转移边转移至一个终止状态,那么 DFA 就接受它,否则不接受。

特别地,DFA 中存在空状态,记为 \(\text{null}\)\(\text{null}\) 不属于 \(F\),也不存在任何转移出去的边。从状态 \(i\) 沿着 \(c\) 转移到 \(\text{null}\) 当且仅当 \(i\) 不存在 \(c\) 的转移边,即不存在 \(\delta(i, c)\)

3. 常用的 DFA

3.1 接受超集

即接受后缀为某个(或某些)字符串的字符串。

KMP 自动机 接受后缀为某个字符串 \(s\) 的字符串,它的终止状态集合只含 \(\lvert s \rvert\),它的转移函数如下:

\[\delta(i, c) = \begin{cases} i + 1 & s_{i+1} = c \\ 0 & s_1 \neq 0 \ \land \ i = 0 \\ \delta(\pi(i), c) & s_{i+1} \neq c \ \land \ i > 0 \end{cases} \]

容易发现,第三部分就是 KMP 中跳 nxt 的过程。

AC 自动机 接受后缀为某个些字符串的字符串,它与 KMP 自动机的区别是 AC 自动机可以处理多个字符串,也就是我们熟知的多模式串匹配。

3.2 接受子集

即接受为某个(或某些)字符串后缀的字符串。

后缀自动机,即 SAM,它接受为一个字符串后缀的字符串。而 广义后缀自动机,即广义 SAM,它接受为一些字符串后缀的字符串。它们的关系与 KMP 自动机和 AC 自动机的关系是一样的。

4. 后缀链接

这里匹配是广义的匹配,即让一对字符串满足一些特定的要求。

后缀链接在失配时产生,它从一个状态 \(i\) 指向一个比这个状态更加容易匹配的字符串 \(j\),且 \(j\)\(i\) 的后缀。

在常见的 DFA 中,所有后缀链接可以构成一颗树,它可以将图上的问题转化为树上的问题,进而降低实现难度。

posted @ 2025-04-05 12:06  Eliauk_FP  阅读(157)  评论(0)    收藏  举报