DFA到RE
约 476 字大约 2 分钟
2024-12-28
从DFA到正则表达式
我们在之前的NFA一节,引入了一张图。
图中的Tompson's construction
,Subset construction
和DFA Minimization
都在前面的章节中聊过了,还剩下从DFA到RE之间的Kleen's construction
。
算法假设DFA的状态编号从 0 到 ∣D∣−1,DFA的接受状态集合为 DA。
我们将符号 Rijk 来表示描述所有从 di 到 dj的路径上而不经过编号高于dk 的状态的正则表达式。这里"通过"的意思是,从 di 到 dj 之间的路径上,任何状态的编号都小于等于 dk。假设一个DFA具有一个状态转移 d1→d16,R1,162 将不会为空。
Kleen's construction
的执行过程大概如下:
- 初始化,算法将所有从 di 到 dj 的直接路径,记作 Rij−1。当 i=j 时,Rij−1 为 ε。
- 进行迭代,每次迭代都会构建更长的路径。每次通过添加通过 dk的路径,利用 Rijk−1 来计算 Rijk。
- 从 di 到 dk 的所有路径的集合,这些路径不经过编号高于k-1的状态,与 dk到自身的任意路径相连接,这些路径也不经过编号高于 k−1 的状态,再与从 dk 到 dj 的所有路径的集合相连接,这些路径同样不经过编号高于k-1的状态.
Rijk←Rikk−1 (Rkkk−1)∗Rkjk−1 +Rijk−1
- 当 k 循环终止时,不同的 Rijk 计算了图中所有的路径。
- 此时从所有路径中,找到从起始状态 d0 到接受状态 dj∈DA 的路径,这些路径构成了DFA的正则表达式。
更新日志
2025/1/4 14:08
查看所有更新日志
a564f
-寒假每日一题更新于