给定一种常规语言(NFA,DFA,语法或正则表达式),如何计算给定语言中接受单词的数量?“正好有n个字母”和“最多n个字母”都令人感兴趣。
玛格丽特·阿克曼(Margareta Ackerman)撰写了两篇有关NFA接受的单词枚举的相关主题的论文,但是我无法对其进行修改以有效计数。
似乎常规语言的受限制性质应该使对它们的计数相对容易-我几乎期望公式比算法更多。不幸的是,到目前为止,我的搜索没有发现任何内容,因此我必须使用错误的术语。
给定一种常规语言(NFA,DFA,语法或正则表达式),如何计算给定语言中接受单词的数量?“正好有n个字母”和“最多n个字母”都令人感兴趣。
玛格丽特·阿克曼(Margareta Ackerman)撰写了两篇有关NFA接受的单词枚举的相关主题的论文,但是我无法对其进行修改以有效计数。
似乎常规语言的受限制性质应该使对它们的计数相对容易-我几乎期望公式比算法更多。不幸的是,到目前为止,我的搜索没有发现任何内容,因此我必须使用错误的术语。
Answers:
对于初始状态为状态的DFA,在状态i中结束的长度为k的字数为A k [ 0 ,i ],其中A是DFA的传输矩阵(其中第i行和第j列中的数字是导致从状态i转换为状态j的不同输入符号的数量。因此,即使当k时,您也可以轻松地计算长度为k的接受单词 仅通过计算矩阵乘方并添加与接受状态相对应的项,该函数就具有适度的大。
同样的事情也适用于接受长度最大为单词,但矩阵略有不同。添加矩阵的额外行和列,在单元格中同时在行和列中添加一个,在初始状态的新行和列中添加一个,在其他所有单元格中添加一个。这种变化对矩阵的影响是在每种功率下为初始状态增加了一条路径。
这不适用于NFA。我怀疑最好的方法就是将其转换为DFA,然后应用矩阵供电算法。
让是一个(非确定性)有限自动化与起始状态q 1,Q ˚F ⊆ Q和δ ⊆ Q × Σ × Q。
让为所有可以从q i开始接受的单词的生成函数,即其级数展开的第n个系数[ z n ] Q i = | { w ∣ | w | = Ñ ∧ 瓦特 从接受 q 我 } | 。
显然:
求解所得的(线性)方程组(使用Mathematica或类似工具)。然后,[ z n ] Q 1是期望量。
这可以追溯到Chomsky和Schützenberger(1963)为语法引入的一种技术。它很容易转移到有限自动机。
编辑:如果要考虑过渡,只需在相应过渡的总和中省略因子x。Similiarly,如果你有“压缩”的边缘,即而不是象征一个∈ Σ一个字w ^ ∈ Σ ķ上的转变,取代X与X ķ。
我认为这是一个很难计数的问题,请参阅本文:计算给定长度的规则序列的大小是#P-complete:S。Kannan,Z。Sweedyk和SR Mahaney。常规语言中的字符串计数和随机生成。在ACM-SIAM离散算法专题讨论会(SODA)中,第551-557页,1995年。