【问题标题】:Data structure to store the nodes of a DFA存储 DFA 节点的数据结构
【发布时间】: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


【解决方案1】:

节点q有两种信息:

  • 布尔信息(q ∈ F)
  • (a,n) 的对列表使得 δ(q,a)==n(即从 q 可到达的字符/目标节点对的列表)

这两条信息(布尔值和对列表)可以表示为单个序列,您可以为该序列计算哈希键。

这将使您能够按您感兴趣的属性对节点进行哈希处理。为给定节点 p 搜索候选节点 q 将接近 O(1)。

(对于您在 cmets 中提到的最小化算法,这意味着您需要在每次迭代后重建此哈希,因为对中的目标节点指针将因迭代期间执行的操作而改变。)

【讨论】:

  • 我已经做到了。我创建了一个代表信息的字符串,并使用了 djb2 哈希函数,但是对于大型词典(包含大约 4 000 000 个自动机应该接受的单词),我的内存不足。
  • 当您将(a,n) 对中的目标节点转换为字符串时,您是如何表示它们的?您应该将它们表示为int 或node*,并使散列函数按此处理它们,而不是将它们序列化为字符串。您也可以尝试仅将 node* 放入哈希中,而不是整个字符串的副本或完整节点的副本。此外,您应该检查您在内存中保留了多少哈希表(如果您运行多次最小化迭代,您可能会在每次迭代中构建一个新表并保留以前的副本..?)
  • 表示信息的字符串如下:以0或1开头,根据节点是否为final,然后对(a,n)编码如下a 是一个int,对应于符号a 在字母表中的位置,n 是另一个int,它转换到符号a 的节点的索引。然后,我使用unordered_map<unsigned long,node*>,其中unsigned long 是从哈希函数djb2 返回的值,node * 是为其构建字符串的节点。
  • @user763852 听起来不错。如果仍然太大,您可以尝试将std::unordered_map 替换为another implementation。但您可能会通过研究使用不同的最小化算法获得更多收益。
【解决方案2】:

我为每个节点构造了一个字符串,并将这些字符串放入 AVL 树中。它比散列函数和无序映射的解决方案执行得更快,并且使用的内存要少得多。

代表节点的字符串如下所示:它以0或1开头,根据节点是否为final,然后对(a,n)编码如下:a是一个int 对应于符号a 在字母表中的位置,n 是另一个int,它转换到的节点的索引与符号a。

【讨论】:

  • 看来你已经有了你想要的。但是如果您需要更快的速度,那么寻找 BDD(二元决策图)可能是值得的。 BDD 是一种非常快速的存储逻辑公式的方法,但它们也可以用于存储有限状态机 - 您可以在网上找到一些信息
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多