DFA与NFA的区别在于:DFA的每一次输入只对应一个结果,而NFA的依次输入可能对应多个结果,形成一个结果集,可以使用子集法将NFA构造为DFA,大白话就是,DFA的一条边,上面一个条件吧,它只能有一个这条边,而NFA的话,它是可以有多个,指向不同的节点,(当然不同条件的边谁都有),这也正是为什么它的表的元素是一个集合。
一般凭直观构造出的自动机都是NFA,而要把NFA转换成DFA,要用子集构造法。构建DFA的目的是消除歧义性,毕竟可以有多个走法,那么走谁呢?是吧。一般是正则表达式->NFA->DFA->DFA化简。
定义真的是蛮变态的,还是自己总结的清楚简单直接明白。下面介绍子集构造法NFA转DFA。就是找闭包而已。
这里的意思就是从0开始,找0的闭包是为A,闭包在1中已经说过了,然后看输入符号a后的那一个闭包就是B,然后一直往下写就是了(允许重复着),这个填出来的表就是DFA表:
然后就按照表画DFA自动机就可以了。有限自动机也是有双圈。
这么简单的事情愣是说的那么复杂。。。
紧接着就是DFA的化简,化简一样是说的超级啰嗦。
一个通路只能走向一个类,例如b走向G2,G1的话,那么就需要进行拆分,把B拆出来。
原理是什么呢?如果说,多个节点,它们的指向的都是同样的话,那么它们是不是可以归为一个节点?如果仅仅是一个节点了,那么它走谁都无所谓了。除了在本区块内互窜外,出去是应该是一致的。