<<
菲律宾云顶赌场
赌博机图中一共有4个状态S0, S1, S2, S3,在每个状态基础上输入字符a或者b就会进入下一个状态。如果经过一系列输入,最终如果能达到状态S3,则输入内容一定满足正则表达式[a|b]*abb。
为了更清晰表述问题,将上图转换为状态转换表,第一列为当前状态,第二列为输入a后当前状态的跳转,第三列为输入b后当前状态的跳转。其中S0为起始状态,S3为接受状态,从起始状态起经过一系列输入到达接受状态,那么输入内容即满足[a|b]*abb。
状态abS0S1S0
S1S1S2
S2S1S3
S3S1S0其实上图就是一个DFA实例(确定有限自动机),下面给出DFA较为严格的定义。一个确定的有穷自动机(DFA) M 是一个五元组:M = (K, ∑, f, S, Z),其中:
下面用字典实现[a|b]*abb的确定有限自动机,然后判断输入字符串是否满足正则表达式。
DFA_func = {0: {"a": 1, "b": 0}, 1: {"a": 1, "b": 2}, 2: {"a": 1, "b": 3}, 3: {"a": 1, "b": 0} } input_symbol = ["a", "b"] current_state = 0 accept_state = 3 strings = ["ababaaabb", "ababcaabb", "abbab"] for string in strings: for char in string: if char not in input_symbol: break else: current_state = DFA_func[current_state][char] if current_state == 3: print string, "---> Match!" else: print string, "--->No match!" current_state = 0 """outputs: ababaaabb ---> Match! ababcaabb --->No match! abbab --->No match! """
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30DFA_func = {0: {"a": 1, "b": 0},
1: {"a": 1, "b": 2},
2: {"a": 1, "b": 3},
3: {"a": 1, "b": 0}
}
input_symbol = ["a", "b"]
current_state = 0
accept_state = 3
strings = ["ababaaabb",
"ababcaabb",
"abbab"]
for string in strings:
for char in string:
if char not in input_symbol:
break
else:
current_state = DFA_func[current_state][char]
if current_state == 3:
print string, "---> Match!"
else:
print string, "--->No match!"
current_state = 0
"""outputs:
ababaaabb ---> Match!
ababcaabb --->No match!
abbab --->No match!
"""
上面的例子可以看出DFA识别语言简单直接,便于用程序实现,但是DFA较难从正则表达式直接转换。如果我们能找到一种表达方式,用以连接正则表达式和DFA,那么就可以让计算机识别正则表达式了。事实上,确实有这么一种表达方式,可以作为正则表达式和DFA的桥梁,而且很类似DFA,那就是非确定有限自动机(NFA)。
还是上面的例子,如果用NFA表示流程图,就如下图所示:
看上去很直观,很有[a|b]*abb的神韵。它转换为状态转换表如下:
状态abS0S0, S1S0
S1ΦS2
S2ΦS3
S3ΦΦNFA的定义与DFA区别不大,M = (K, ∑, f, S, Z),其中:
菲律宾云顶赌场
赌博机图中一共有4个状态S0, S1, S2, S3,在每个状态基础上输入字符a或者b就会进入下一个状态。如果经过一系列输入,最终如果能达到状态S3,则输入内容一定满足正则表达式[a|b]*abb。
为了更清晰表述问题,将上图转换为状态转换表,第一列为当前状态,第二列为输入a后当前状态的跳转,第三列为输入b后当前状态的跳转。其中S0为起始状态,S3为接受状态,从起始状态起经过一系列输入到达接受状态,那么输入内容即满足[a|b]*abb。
状态abS0S1S0
S1S1S2
S2S1S3
S3S1S0其实上图就是一个DFA实例(确定有限自动机),下面给出DFA较为严格的定义。一个确定的有穷自动机(DFA) M 是一个五元组:M = (K, ∑, f, S, Z),其中:
- K是一个有穷集,它的每个元素称为一个状态;
- ∑是一个有穷字母表,它的每个元素称为一个输入符号,所以也称∑为输入符号表;
- f是转换函数,是在K×∑→K上的映射,如f(ki, a)→kj,ki∈K,kj∈K就意味着当前状态为ki,输入符号为a时,将转换为下一个状态kj,我们将kj称作ki的一个后继状态;
- S∈K是唯一的一个初态;
- Z⊆K是一个状态集,为可接受状态或者结束状态。
下面用字典实现[a|b]*abb的确定有限自动机,然后判断输入字符串是否满足正则表达式。
DFA_func = {0: {"a": 1, "b": 0}, 1: {"a": 1, "b": 2}, 2: {"a": 1, "b": 3}, 3: {"a": 1, "b": 0} } input_symbol = ["a", "b"] current_state = 0 accept_state = 3 strings = ["ababaaabb", "ababcaabb", "abbab"] for string in strings: for char in string: if char not in input_symbol: break else: current_state = DFA_func[current_state][char] if current_state == 3: print string, "---> Match!" else: print string, "--->No match!" current_state = 0 """outputs: ababaaabb ---> Match! ababcaabb --->No match! abbab --->No match! """
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30DFA_func = {0: {"a": 1, "b": 0},
1: {"a": 1, "b": 2},
2: {"a": 1, "b": 3},
3: {"a": 1, "b": 0}
}
input_symbol = ["a", "b"]
current_state = 0
accept_state = 3
strings = ["ababaaabb",
"ababcaabb",
"abbab"]
for string in strings:
for char in string:
if char not in input_symbol:
break
else:
current_state = DFA_func[current_state][char]
if current_state == 3:
print string, "---> Match!"
else:
print string, "--->No match!"
current_state = 0
"""outputs:
ababaaabb ---> Match!
ababcaabb --->No match!
abbab --->No match!
"""
上面的例子可以看出DFA识别语言简单直接,便于用程序实现,但是DFA较难从正则表达式直接转换。如果我们能找到一种表达方式,用以连接正则表达式和DFA,那么就可以让计算机识别正则表达式了。事实上,确实有这么一种表达方式,可以作为正则表达式和DFA的桥梁,而且很类似DFA,那就是非确定有限自动机(NFA)。
还是上面的例子,如果用NFA表示流程图,就如下图所示:
看上去很直观,很有[a|b]*abb的神韵。它转换为状态转换表如下:
状态abS0S0, S1S0
S1ΦS2
S2ΦS3
S3ΦΦNFA的定义与DFA区别不大,M = (K, ∑, f, S, Z),其中:
- K是一个有穷集,它的每个元素称为一个状态;
- ∑是一个有穷字母表,它的每个元素称为一个输入符号,ε表示输入为空,且ε不存在于∑;
- f是转换函数,是在K×∑*→K上的映射,∑*说明存在遇到ε的情况,f(ki, a)是一个多值函数;
- S∈K是唯一的一个初态;
- Z⊆K是一个状态集,为可接受状态或者结束状态。
http://rxeqv68272.weebly.com/
http://yunweec.weebly.com/
http://sdfbyjg.weebly.com/
http://rtjhyj.weebly.com/
http://jdtjhj.weebly.com/
http://vfdbfb.weebly.com/
http://vfdbzsdf.weebly.com/
http://gfj7udv.weebly.com/
http://dfukfg.weebly.com/
http://sdgsdgsdf342t4.weebly.com/
http://srgaerhrfg.weebly.com/
http://dsbsdb.weebly.com/
http://sedrfgfn.weebly.com/
http://bdfnfgn.weebly.com/
http://bdfbndfn.weebly.com/
http://bsdbfdb.weebly.com/
http://dsbrfhbgfb.weebly.com/
http://egdrhf.weebly.com/
http://dvbfbf.weebly.com/
http://sdb21fd0b.weebly.com/
http://lbjh6436.weebly.com/
http://fhghhhccc.weebly.com/
http://dfgn0vdv.weebly.com/
http://ghg10jn00njj.weebly.com/
http://sdghfg41.weebly.com/
http://vdfb0fb0.weebly.com/
http://nfdvd.weebly.com/
http://88fvdf.weebly.com/
http://yunweec.weebly.com/
http://sdfbyjg.weebly.com/
http://rtjhyj.weebly.com/
http://jdtjhj.weebly.com/
http://vfdbfb.weebly.com/
http://vfdbzsdf.weebly.com/
http://gfj7udv.weebly.com/
http://dfukfg.weebly.com/
http://sdgsdgsdf342t4.weebly.com/
http://srgaerhrfg.weebly.com/
http://dsbsdb.weebly.com/
http://sedrfgfn.weebly.com/
http://bdfnfgn.weebly.com/
http://bdfbndfn.weebly.com/
http://bsdbfdb.weebly.com/
http://dsbrfhbgfb.weebly.com/
http://egdrhf.weebly.com/
http://dvbfbf.weebly.com/
http://sdb21fd0b.weebly.com/
http://lbjh6436.weebly.com/
http://fhghhhccc.weebly.com/
http://dfgn0vdv.weebly.com/
http://ghg10jn00njj.weebly.com/
http://sdghfg41.weebly.com/
http://vdfb0fb0.weebly.com/
http://nfdvd.weebly.com/
http://88fvdf.weebly.com/