自动机与克莱恩星

时间:2012-06-11 19:50:18

标签: algorithm kleene-star

我正在学习自动机。你能帮我理解Kleene闭合的自动机是如何工作的吗?假设我有字母a,b,c,我需要找到以Kleene星号结尾的文字 - 比如ab * bac - 它将如何运作?

3 个答案:

答案 0 :(得分:4)

Kleene星('*')表示你可以拥有任意数量的角色(0或更多)。 a*将匹配任意数量的。

(ab)*将匹配任意数量的字符串“ab”

如果您尝试匹配表达式中的实际星号,您编写它的方式完全取决于您正在使用的正则表达式的语法。对于一般情况,后向斜杠\用作转义字符:

\*将匹配星号。

为了识别最后的模式,请使用连接:

(a U b)*c*将匹配任何包含0或更多'c'的字符串,前面加上任意数量的a或b。

对于匹配以Kleene星结尾的文本,您可以再次出现0个或更多字符串:

ab(c)* - 可能的比赛:ab,abc abcc,abccc等

a(bc)* - 可能的匹配:a,abc,abcbc,abcbcbc等。

答案 1 :(得分:4)

问题似乎更多的是关于自动机如何处理Kleene闭合而不是Kleene闭合意味着什么。

使用简单的正则表达式,例如abc,设计自动机来识别它是非常简单的。每个州基本上都会告诉你到目前为止你在表达式中的位置。状态0表示它还没有看到。状态1表示它被看见a。状态2表示它被看见ab。等

Kleene闭包的困难在于像ab*bc这样的模式引入了歧义。一旦自动机看到a,然后面临b,它就不知道bb*还是文字{{1}的一部分跟随它,直到它读取更多符号才会知道 - 可能还有更多符号。

简单的答案是自动机只是一个字面意味着它不知道采取了哪条路径的状态。

在简单的情况下,您可以直接构建此自动机。在一般情况下,您通常会构建一个称为非确定性有限自动机的东西。您可以模拟NDFA,或者 - 如果性能至关重要 - 您可以应用将NDFA转换为确定性的算法。该算法基本上为您生成所有不明确的状态。

答案 2 :(得分:0)

你的英语表达ab * bac会读到:

a后跟0或更多b,然后是bac

strings that would evaluate as a match to the regular expression if used for search

abac
abbbbbbbbbbac
abbac

strings that would not match

abaca //added extra literal
bac //missing leading a

如前面的答案所述,实际上搜索a *需要一个特定于实现的转义字符,并且需要知道您选择的语言/库。