Regex 如何将NFA图转换为正则表达式?

Regex 如何将NFA图转换为正则表达式?,regex,nfa,Regex,Nfa,我正在复习正则表达式,并一直停留在以下问题上: 提供一个正则表达式来描述以下NFA的语言: 我不知道如何回答下面的问题,我不想有人给我答案。如果可能的话,我将非常感谢您提供一些关于如何解决此类问题或如何解决此特定问题的指导。谢谢大家! 非常感谢您的帮助 基本转换,你知道的 {q0, x, q0} becomes x* {q0, x, q1} becomes x {q0, x, q1}, {q0, y, q1} becomes x+y 你的图表是DFA。 您最右侧的状态不应为q1。您有双q1。

我正在复习正则表达式,并一直停留在以下问题上:

提供一个正则表达式来描述以下NFA的语言:

我不知道如何回答下面的问题,我不想有人给我答案。如果可能的话,我将非常感谢您提供一些关于如何解决此类问题或如何解决此特定问题的指导。谢谢大家!


非常感谢您的帮助

基本转换,你知道的

{q0, x, q0} becomes x*
{q0, x, q1} becomes x
{q0, x, q1}, {q0, y, q1} becomes x+y
你的图表是DFA。 您最右侧的状态不应为
q1
。您有双
q1
。从现在起命名最正确的州
q3

我认为最困难的部分是因为有从
q3
q1
q2
的过渡

我们将从左边开始

{q0, x, q0},{q0, y, q1} => x*y
q0
为开始状态,
q1
为最终状态。那么
x*y
必须始终发生。其余的可能发生,也可能不发生,因为有从
q3
q1
的转换。我们可以这样写:

RE = x*y( ... )*
我们现在正在括号内工作

{q1, x, q2}, {q1, y, q2} => (x+y)
因为有一个从
q3
q2
的转换,我们可以写:

RE = x*y((x+y)( ... ))*
因为只有一个转换到达最终状态,即
{q3,y,q1}
,所以我们将
y
放在最后

RE = x*y((x+y)( ... )y)*
最后一部分和令人困惑的部分是
{q2,y,q2},{q2,x,q3},{q3,x,q2}=>(y+xx)*x

说明:

我们在
q2
上,我们有
y*
(xx)*
一次或多次时间返回
q2
。我们可以写
(y*+(xx)*)*
或者简单地写
(y+xx)*
。请记住,我们必须在
q3
上通过读取
y
进入最终状态,然后从
q2
我们需要读取
x
,以便
(y+xx)*x

因此,完整的正则表达式:
x*y((x+y)(y+xx)*xy)*

的答案不正确
x*y((x+y)(y+xx)*xy)*
接受不是解决方案的字符串yxxxy

检查有关如何完成的相关线程(注释)


正则表达式是:
x*y((x | y)y*x(xy*x)**y)*

一种方法:步骤1:将NFA转换为DFA。步骤2:。可能也很有用。实际上,直接将NFA转换为RE更容易、更干净,而不需要先转换为DFA——DFA可能要大得多。