我需要一个数据结构来存储有限确定性自动机的节点,以便找到满足特定条件的节点是快速的(对数)。 有问题的条件如下:
我有一个节点
p
,我必须找到一个节点q
,这样:(p ∈ F ≡ q ∈ F) & (∀ a : a ∈ Σ : δ(p,a) = δ(q,a))
。也就是说,p
和q
要么都是最终的,要么两者都不是,并且它们转换到相同的节点。
我不想通过所有节点,因为那会很慢。显然,如果q
具有转换的字母字符集与p
具有转换的集合不同,q
不是我正在寻找的节点
此外,如果p
和q
的转换次数不同,q
也不是我想要的节点。所以我在考虑一种数据结构,它根据节点的终结性和转换次数对节点进行排序,因此我不必查看所有节点,只需查看具有相同终结性和相同转换次数的节点。但这仍然不是对数的。任何想法。
我正在使用c ++。
答案 0 :(得分:0)
节点q
有两种类型的信息:
(q ∈ F)
(a,n)
的列表,使得δ(q,a)== n(即从q可到达的字符/目标节点对列表)这两条信息(布尔值和对列表)可以表示为单个序列,您可以计算此序列的哈希键。
这将使您感兴趣的属性对节点进行哈希处理。搜索给定节点q
的候选节点p
将接近O(1)。
(对于您在注释中提到的最小化算法,这意味着您需要在每次迭代后重建此哈希,因为对中的目标节点指针将因迭代期间执行的操作而发生更改。)< / p>
答案 1 :(得分:0)
我为每个节点构造了一个字符串,然后将字符串放在AVL树中。它的执行速度比使用散列函数和无序映射的解决方案更快,并且使用的内存更少。
表示节点的字符串如下所示:它以0
或1
开头,根据节点是否为final,然后将(a,n)
对编码为如下:a
是一个int
,对应于字母表中符号a
的位置,而n
是另一个int
,它所拥有的节点的索引转换为符号a
。