2

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

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

我不想遍历所有节点,因为那样会很慢。显然,如果具有转换的字母字符集与q具有转换的集合不同pq则不是我要查找的节点。

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

我正在使用 C++。

4

2 回答 2

0

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

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

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

这将能够通过您感兴趣的属性对节点进行散列。搜索q给定节点的候选节点p将接近 O(1)。

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

于 2013-07-01T07:10:30.133 回答
0

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

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

于 2013-07-03T08:54:54.820 回答