- 论坛徽章:
- 3
|
本帖最后由 captivated 于 2013-02-17 18:11 编辑
回复 14# cjaizss
哦,第三个图和正则表达式a*ab等价的,第一个图和第二个图分别等价于正则表达式a*和ab. 我都画一张里面,你可能没注意,第三个图起始状态不是接受状态,只有标蓝色的圆圈才是接受状态。
a*ab可以适配单词ab, 那正则表达式中的a*就相当于没从输入流中取东西, 直接从s0开始一个空的epsilon转移到了s1, 就是不从输入流中取字符它就自己转移了. 接下来s1状态从输入流中取出a, 转移到s2, 然后s2状态了从输入流中取出b, 转移到s3, 此时输入流耗尽,s3是接受状态,因此这个自动机接受字符串/单词ab.
a*ab也可以适配单词aab. 那这样子s0的时候,从输入流中取出a, 转移到s0自己。接下来不从输入流取字符, 空转移到s1. 然后s1 -- a --> s2, s2 -- b --> s3, 这时输入流耗尽,自动机也正好处于接受状态,所以这个自动机也接受字符串aab.
当处于s0的时候,这时输入流中剩下的字符串是什么样子自动机是不知道的,自动机只能看到输入流中最前面的那个即将读取的字符。该怎么转移是由整个字符串决定的。
就像 ab 和 aab 两个单词, 自动机一开始处于起始状态s0, 此时自动机能看到的只是字符a,但是ab和aab, aaab等等这些字符串自动机都应该接受,而且是必须在输入流刚好耗尽时自动机刚好处于接受状态。
那在s0的时候自动机怎么知道该空转移到s1, 还是从输入流中读取字符a转移到s0呢?这是字符a后面剩下的字符串决定的。
那么在s0的时候自动机就面临两个选择: 不从输入流中取字符,空转移到s1; 或者从输入流中取字符a, 又转移到s0. 只要还在s0这个状态, 自动机都面临该怎么转移的选择,每次都要,该转移到那一个,在只看到输入流的最前面的字符的时候是不确定的,所以才叫非确定型自动机。所以处理的方式就是贴中说的,要么先选一个转移匹配下去,等到错了又回头从来;要么在s0的时候我就两个都选,单线程变双线程,能继续匹配下去的线程就存活,不能继续匹配的就死掉,只要输入流耗尽了最终还有存活的线程,而且该线程自动机状态又恰好处于接受状态的时候,自动机接受该输入流/字符串。
由于空转移也不是限定只能有一个的,不同的正则表达式和不同的转移图/自动机等价。有时候在某个状态的时候可以空转移到几个另外的状态。假设一个自动机有N个状态,从某个状态能空转移到的状态数肯定不超过N,所以不论任何状态,它能[通过空转移]转移到的状态是一个状态集合,这个集合属于N个状态的幂集合,就是2 ^ N。这个是肯定的。不过为什么(不论任何NFA)其配置数在任意时刻最大是|Sigema| ^ N, 就一直没想通。。。
|
|