woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

NFA转DFA

一个非确定自动机( NFA) 在读入符号串之后,并不确切地知道自动机处于哪个状态。但可以肯定一定处于状态集中的某一状态。该状态集记做 {q1,q2,…qk} 。而一个等价的确定自动机( DFA) 读入同样的 w 一定处于某个确定的状态上。这样,都是读入同样的 w DFA 到达某一个状态,而 NFA 到达某一个状态集。由 w 的任意性,可将 NFA 的所有的状态集和 DFA 的状态一一对应起来。这种对应的前提就是能识别同样的输入串。即 L(M1)=L(M2)

       显然,后一个状态集是依赖于前一个状态集的,是在前一个状态集的基础上,(其内任意结点)经过同一条路径到达的。下面是一个简单的例子:

   clip_image001

可以看出,其核心是将 NFA 状态集归并为 DFA 中的状态。在 NFA 中,无论是从 1 4 ,还是 1 5 ,作为集合来讲都是集合 1 到集合 2 ,最为重要得是经过的条件都是 a 。因而从识别语言的效果是一样的。这使得这些弧合并成为可能。

考虑集合覆盖的情况。

clip_image002

一个结点属于第一个集合又同时属于第二个集合。这种情况不一定好理解。但如果从路径的历史的角度进一步区分,即不同的时间经过同一个结点,将其看成是不同的状态。按照这种时空的角度进一步区分,得到右图。这和图 1 是类似的。

再来看看带有终态结点的情况:

   clip_image003

ab abb 均为该 NFA 识别的句子,其转换如下:

     

 

I a

Ib

A{1,2}

{3}

Φ

B{3}

Φ

{3,4}

C{3,4}

Φ

{3,4}

从某种意义上说。 NFA 中的状态 3 DFA 中被分离成两部分,当首次到达 3 时应该是状态 B ,而第二次以后再到达 3 则应该属于状态 C

根据规则, C{3,4} DFA 的终态,但在 NFA 中,只有 4 为终态, C 中仍然有 3 为非终态,若有路径 1 à 3 à 3 映射到 DFA 中也是 A à B à C ,何解?

这里面最关键的是:对任意一个句子,总可以在两个图中分别找到一条路径,形成对应关系。并不是说 NFA 中的每条路径都要和 DFA 中的每条路径一一对应。

当识别句子 ab 时,选择由 3 直接到达 4 的路径。当识别句子 abb 时,则在状态 3 循环一次再到达 4

现在设想,通过 1 à 3 à 3 经过的路径也是 ab 。但此时并未到达终态。可以说,在到达 C 中的 3 时,必然选择了两个 b 以上的句子。

而这样的路径与选择句子有关系。

对于 NFA 能识别的句子,在 DFA 中也能识别。

对于 NFA 不能识别的句子,在 DFA 中也不能识别。

 

posted on 2008-12-13 15:21 肥仔 阅读(3029) 评论(0)  编辑 收藏 引用 所属分类: 状态机 & 自动机 & 形式语言


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理