DFA状态数的最小化方法

这里首先引入可区分状态的概念:

M=(K,\Sigma,f,S_0,Z) 为以DFA,并设s和t是M的两个不同状态

我们说状态s,t被某一输入串w所区分,是指从s,t中之一触发,当扫视完w之后到达M的终态,但从其中的另一个状态出发,当扫视完同一个w后进入非终态

如果两个状态s和t不可区分(即对于任意输入串w,当且仅当 f(s,w)\in Z 时 f(t,w)\in Z ),则称s和t等价。

显然,等价于不等价对于一般的输入串w而言并不是互斥的,达到互斥的前提条件是:w至少能被其中一个DFA扫视后进入终态。

显然,相互等价的状态可以进行合并,以降低DFA的复杂度。

存在这样一个算法,该算法将M的状态集K逐步进行划分,并使得最终按上述状态的等价关系将K划分为r个( r\le|K| )互不相交的子集,使得属于同一子集中的任何两个状态都是等价的,而属于不同子集的任意两个状态都是可区分的。

执行步骤如下:

1、首先,将M的状态集K按终态和非终态划分为两个子集Z和K-Z,以构成初始划分,记为 \pi=\{Z,K-Z\ } ,显然,终态和非终态子集不会相交,且二者必定是可区分的(例如输入串为 \epsilon )。

2、设当前的划分 \pi 中已含有m个子集,即 \pi=\{I_1,I_2,...,I_m\}

显然,目前为止,属于不同子集的状态是可区分的,而属于同一子集中的状态则是待区分的。

因此我们需要对划分中的每一个子集 I_i=\{S_{i1},S_{i2},...,S_{in}\} 中的各个状态 S_{ir}(S_{ir}\in K,1\le r\le n) 进行考察,判断其是否可以继续划分。

若对于某个 I_i=\{S_{ip},S_{iq},...\} 而言,对于状态 S_{ip} S_{iq} \exists a\in \Sigma ,使得 f(S_{ip},a)=S_{ju} f(S_{iq},a)=S_{kv} ,而状态 S_{ju} S_{kv} 分属 \pi 中两个不同的子集 I_j I_k ,故 S_{ju} S_{kv} 被某一w所区分,从而 S_{ip} S_{iq} 被某一w所区分,故应将子集 I_i 进行进一步的细分,使得 S_{ip} S_{iq} 分别属于 I_i 的不同子集(这里要注意: I_i 中存在多个子集,我们需要对每一个子集进行逐一判断,若对于某两个状态而言,其无论选择字母表 \Sigma 中的哪一个符号,依然可以到达划分 \pi 的同一个子集中,那么,这两个状态必须放在同一个子集中,属于待区分状态,否则,应拆到不同的子集中,属于可区分状态)。

若划分 \pi 发生了变化,则继续重复上述的划分步骤,直到 \pi 不再改变为止。

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据