【问题标题】:How to create a DAWG? [closed]如何创建 DAWG? [关闭]
【发布时间】:2012-12-24 21:09:57
【问题描述】:

如何创建DAWG?我发现有两种方法;一个是将 trie 转换为 dawg,另一个是立即创建一个新的 DAWG?哪一个最容易?能否请您详细说明这两者并提供一些链接?

【问题讨论】:

    标签: c++ data-structures


    【解决方案1】:

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

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

    完成此操作后,您将获得一个 DAWG,用于您感兴趣的一组单词。

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

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

    希望这会有所帮助!

    【讨论】:

    • 我正在为字典构建一个 dawg?所以重点是我应该首先建立一个特里?如果是这样的话,它会变得更容易,因为我有一些在书中创建 trie 的参考资料?而且我并不完全理解算法。一些视觉帮助将不胜感激,或者可能提供链接。提前谢谢你。
    • @UsmanAmjed-我没有任何 DFA 最小化算法的可视化,因为该算法有些复杂。但是,老实说,编写代码并不是那么难。至于构建尝试 - 我会强烈建议不要尝试编写 DAWG,直到您对尝试使用感到满意为止。尝试比 DAWG 简单得多,并提供相同的性能保证,但内存开销要高得多。我建议先阅读它们。
    • 是的,我会的。我正在构建一个大约 500000 个单词的字典;内存开销会很大吗?我什至应该去找dawgs吗?就遍历等而言,与尝试有很大不同吗?
    • @UsmanAmjed- 在这种情况下,与 DAWG 相比,trie 肯定会产生巨大的内存开销,因此压缩单词会很有用。但是,根据您的应用程序,您最好使用哈希表或其他结构。
    • @templatetypedef 您绝对可以直接从单词列表中构造一个 dawg,这是标准的 goto 论文,如果列表最初是排序的,您可以更轻松,但是如果列表是也未排序:aclweb.org/anthology/J00-1002.pdf
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 2015-01-23
    • 2015-06-09
    • 2012-04-09
    • 2020-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多