【发布时间】:2012-12-24 21:09:57
【问题描述】:
如何创建DAWG?我发现有两种方法;一个是将 trie 转换为 dawg,另一个是立即创建一个新的 DAWG?哪一个最容易?能否请您详细说明这两者并提供一些链接?
【问题讨论】:
标签: c++ data-structures
如何创建DAWG?我发现有两种方法;一个是将 trie 转换为 dawg,另一个是立即创建一个新的 DAWG?哪一个最容易?能否请您详细说明这两者并提供一些链接?
【问题讨论】:
标签: c++ data-structures
考虑 DAWG 的一种方法是将单词列表中的所有单词视为最低状态 DFA。因此,构建 DAWG 的传统算法如下:
完成此操作后,您将获得一个 DAWG,用于您感兴趣的一组单词。
该算法的运行时间如下。构造初始 DFA 可以通过为所有原始单词构造一个 trie 来完成(这需要时间 O(n),其中 n 是所有输入字符串中的字符总数),然后填充缺失的转换(这需要时间O(n|Σ|),其中 |Σ| 是字母表中不同字符的数量)。从那里,最小化算法在时间 O(n2 |Σ|) 中运行。这意味着算法的整体运行时间为 O(n2 |Σ|)。
据我所知,没有直接的算法可用于增量构建 DAWG。通常,只有在您已经预先拥有所有单词的情况下,您才会为一组单词构建 DAWG。直观地说,这是正确的,因为插入一个在 DAWG 中已经存在一些后缀的新词可能需要对 DAWG 进行大量重组,以使某些旧的接受状态不接受,反之亦然。从理论上讲,这是因为插入一个新词可能会极大地改变 DFA 可区分关系的等价类,这可能需要对 DFA 的结构进行实质性更改。
希望这会有所帮助!
【讨论】: