自动机

概述

  • 自动机是一种对信号序列进行判定的数学模型。

    • 信号序列:一串有序的信号,例如字符串。

    • 判定:指输出为 \(0/1\)(在输入的信号序列可识别的前提下)。在 OI 中的自动机一般是广义的,即输出是任意的,具体来讲可能是在合法时输出对应方案的权值之类。

  • 一般来讲,自动机可以抽象为一个有向图,点为状态,边为某种转移。

  • 如果需要判定一个有限的信号序列和另外一个信号序列的关系(例如子序列关系),那么常用的方法是对那个有限的信号序列构建一个自动机。

  • 事实上,许多以匹配为基础的字符串算法的本质和关键,都是利用自动机的思想来在不能进一步匹配时设法利用已求出的状态,更准确地说是“如果已有状态不可行,就试试它的后缀”,称为后缀链接,对应的边称为后缀链接边/反边/fail 边(能不舍弃前缀就匹配的当然是正边),通常这些边会构成一个(内向)树形结构,称为后缀链接树/fail 树,且在不同的字符串算法中,后缀链接树有着很大程度上相同的性质。

确定有限状态自动机(DFA)

  • 组成:

    • (1) 字符集 \(\Sigma\),该自动机只能输入这些字符。

    • (2) 状态集 \(Q\)。有向图意义下,DFA 中的状态就相当于图上的顶点。

    • (3) 起始状态 \(start\)\(start\in Q\)\(start\) 是一个特殊的状态。起始状态一般用 \(s\) 表示,为了避免混淆(字符串是 \(s\)),本文中使用 \(start\)

    • (4) 接受状态集 \(F\)\(F\subseteq Q\),是一组特殊的状态。该 DFA 仅接受这些状态,即仅这些状态是合法的,当然也可以说是只有最后停留在这些状态的信息序列是合法的。

    • (5) 转移函数 \(\delta(v,c)=v'\)\(\delta\) 是一个接受两个参数返回一个值的函数,其中第一个参数和返回值都是一个状态,第二个参数是字符集中的一个字符。有向图意义下,DFA 的转移函数就相当于顶点间的边,而每条边上都有一个字符。

      • 当读到的字符不满足当前状态 \(v\) 的任意一个转移函数 \(\delta(v,c)\),可以认为有一条虚边 \(\delta(v,c)=null\),且 \(\delta(null,all)=null,null\notin F\)

      • 可以定义扩展转移函数 \(\delta(v,s)=v'\),其第二个参数为字符串。

      • 应当指出,DFA 的转移函数常常构环乃至自环。

  • 作用:判断一个信号序列是否满足某些条件(即信号序列结束时处在一个接受状态)。同样地,在 OI 中我们往往会对合法方案要求输出权值而非 \(1\)。可以看出,DFA 是在线的。

  • 大概自动机也可以视为一个 \((\Sigma,\delta)\) 的半群...但我认为这是弱化,没有多大意义。

字符串自动机

DP 自动机

posted @ 2023-02-08 08:03  未欣  阅读(93)  评论(0编辑  收藏  举报