【发布时间】:2013-06-28 05:55:41
【问题描述】:
我需要一个数据结构来存储有限确定性自动机的节点,以便快速找到满足特定条件的节点(对数)。 有问题的条件如下:
我有一个节点
p,我必须找到一个节点q,例如:(p ∈ F ≡ q ∈ F) & (∀ a : a ∈ Σ : δ(p,a) = δ(q,a))。也就是说,p和q要么都是最终的,要么都不是,并且它们具有到相同节点的转换。
我不想遍历所有节点,因为那样会很慢。显然,如果q 具有转换的字母字符集与p 具有转换的集合不同,则q 不是我要查找的节点。
此外,如果p 和q 有不同数量的转换,q 又不是我想要的节点。所以我正在考虑一种数据结构,它可以根据节点的终结性和转换次数对节点进行排序,因此我不必查看所有节点,只需查看具有相同终结性和相同转换次数的节点即可。但这仍然不是对数。任何想法。
我正在使用 c++。
【问题讨论】:
-
你想比较你的dfa,是否产生相同的语言?
-
不,我正在逐步构建一个最小的无环 DFA。
-
好的,您正在使用单个 DFA,
-
@user763852 关于您的评论:根据您问题中的定义,我认为您使用 DFA 的一般最小化算法,即最小化算法也适用于具有周期的 DFA。由于您的算法是非循环的,因此可以使用专门的最小化算法来实现更少的内存消耗。我不记得有任何想法,但您可能也应该研究一下。
-
这组幻灯片涵盖了一些用于非循环 DFA 最小化的“逐层”算法:stringology.org/event/2011/psc11p12_presentation.pdf
标签: c++ data-structures dfa