用于存储DFA节点的数据结构

时间:2013-07-01 06:56:53

标签: c++ data-structures dfa

我需要一个数据结构来存储有限确定性自动机的节点,以便找到满足特定条件的节点是快速的(对数)。 有问题的条件如下:

  

我有一个节点p,我必须找到一个节点q,这样:(p ∈ F ≡ q ∈ F) & (∀ a : a ∈ Σ : δ(p,a) = δ(q,a))。也就是说,pq要么都是最终的,要么两者都不是,并且它们转换到相同的节点。

我不想通过所有节点,因为那会很慢。显然,如果q具有转换的字母字符集与p具有转换的集合不同,q不是我正在寻找的节点

此外,如果pq的转换次数不同,q也不是我想要的节点。所以我在考虑一种数据结构,它根据节点的终结性和转换次数对节点进行排序,因此我不必查看所有节点,只需查看具有相同终结性和相同转换次数的节点。但这仍然不是对数的。任何想法。

我正在使用c ++。

2 个答案:

答案 0 :(得分:0)

节点q有两种类型的信息:

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

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

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

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

答案 1 :(得分:0)

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

表示节点的字符串如下所示:它以01开头,根据节点是否为final,然后将(a,n)对编码为如下:a是一个int,对应于字母表中符号a的位置,而n是另一个int,它所拥有的节点的索引转换为符号a