如何创建DAWG?

时间:2012-12-24 21:09:58

标签: c++ data-structures

如何创建 DAWG ?我发现有两种方法;一个是将trie转换为dawg而另一个是直接创建一个新的DAWG?哪一个最简单?你能详细说明这两个并提供一些链接吗?

1 个答案:

答案 0 :(得分:4)

考虑DAWG的一种方法是作为单词列表中所有单词的最小状态DFA。因此,构建DAWG的传统算法如下:

  1. 首先构建一个用于收集单词的trie。
  2. 在trie上添加一个新节点,在所有输入上都有自己的边缘。
  3. 对于trie中的每个缺失字母转换,添加从起始节点到此新死节点的转换。
  4. (此时,您现在拥有一组(可能非最小值) DFA 用于这组词。)
  5. 使用 the standard algorithm for DFA state minimization
  6. 最小化DFA

    完成此操作后,您将获得感兴趣的单词集DAWG。

    该算法的运行时间如下。构造初始DFA可以通过为所有原始单词构建一个trie来完成(这需要花费时间O(n),其中n是所有输入字符串中的字符总数),然后填充缺少的过渡(这需要时间O(n |Σ|),其中|Σ|是字母表中不同字符的数量)。从那里,最小化算法在时间O(n 2 |Σ|)中运行。这意味着算法的总运行时间为O(n 2 |Σ|)。

    据我所知,没有直接的算法来逐步构建DAWG。通常情况下,只有在事先已经拥有所有单词的情况下,才会为一组单词构建DAWG。直观地说,这是事实,因为在DAWG中插入一些已经存在一些后缀的新单词可能需要对DAWG进行大量重组,以使某些旧的接受状态不接受,反之亦然。从理论上讲,这是因为插入一个新词可能会极大地改变DFA可区分关系的等价类,这可能需要对DFA的结构进行实质性的改变。

    希望这有帮助!