原文:https://study.163.com/course/courseMain.htm?courseId=1002830012
从上图看,节点,4,6,7完全可以合并成一个节点。或者说,我们可以把节点4,6去掉而不影响状态机的功能。本节我们的目的就是讨论如何实现DFA的优化功能。
DFA最小化算法描述:
1.把所有状态节点分成两分区,接收状态为一分区,非接收状态为一分区:
节点0,1,2,5是非接收节点,他们统一放入一个分区,分区编号0.
节点3, 4, 6, 7 是接收节点,他们统一放入一个分区,分区标号1.
2.根据每一个状态节点对应输入字符后的跳转情况,进行下一步分区。我们先看输入字符为数字字符的情况,也就是看表中的D列,节点0,2,5对应输入为D时,他们的跳转状态为2,5,5, 这几个状态都在分区0,也就是节点0,2,5对应输入为数字字符时,任跳转到分区0,节点1输入D时,跳转到状态3,状态3在分区1,由此,状态1要从分区0中拿出来,单独成一个分区。同理对于分区1中节点,状态3,对应输入为D时,跳转到NULL, 状态4,6,7对应于输入D,跳转到节点6,7,7,节点6,7,7都在分区1,所以,此时可把状态3拿出来,单独形成一个分区,于是有:
转换后,节点2单独在一个分区标号为2,节点3单独一个分区编号3.
3.我们在看看输入字符为”.” 的情况,分区0中的状态点0接收字符”.”后跳转到状态1, 节点5跳转到状态1,也就是说,状态点0,5接收字符”.”后都转移到同一个分区2,状态点2接收”.”后跳转到节点4,节点4在分区1,因此,状态点2要从分区0中剥离开来,由于分区1,2,3中的状态点都不接收字符”.”所以他们不做处理,于是有下表:
4.基于上面分割的基础上,我们再从来一次,看看还能不能产生新的分割,对输入为D时,分区0中的状态节点0跳转到状态2,状态2在分区4,状态节点跳5跳转到状态5,状态5在分区0,因此,分区0中的两个节点0,5得分割开来:
5.基于上表,我们再对不同输入,各分区中的节点已经不能再分割,所以算法到此就结束了。
根据分割后的情况,我们把点和点间的转移关系,换成分区与分区的转移关系,我们得到新的DFA:
节点0在分区0,输入D后跳转到节点2,节点2在分区4,输入字符”.”,跳转到状态1,状态1在分区2,所以有:
0-(D)->4, 0-.->2
节点5在分区5,输入D后跳转到节点5,节点5在分区5,输入”.”后跳转到节点1,节点1在分区2,所以有:
5-(D)->5, 5-.->2
节点2在分区4,输入D跳转节点5,节点5在分区5,输入”.”跳转到节点4,节点4在分区1,所以有:
4-(D)->5, 4-.->1
节点1在分区2,输入D跳转到节点3,节点3在分区3,所以有:
2-(D)->3
节点4,6,7在分区1,输入D后跳转的点都在分区1,所以有:
1-(D)->1
从而我们得到的优化后的DFA: