Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建DAWG?_C++_Data Structures - Fatal编程技术网

C++ 如何创建DAWG?

C++ 如何创建DAWG?,c++,data-structures,C++,Data Structures,如何创建?我发现有两种方法;一个是将trie转换为dawg,另一个是直接创建新的dawg?哪一个最容易?你能详细说明这两个词并提供一些链接吗?考虑DAWG的一种方法是将其作为单词列表中所有单词的最小状态DFA。因此,构建DAWG的传统算法如下: 首先,为单词集合构建一个trie 将一个新节点添加到trie,使所有输入上的边从自身到自身 对于trie中的每个丢失的字母转换,添加从开始节点到新的死节点的转换 (此时,对于这组单词,您现在有了一个(可能不是最小值)。) 使用最小化DFA 一旦你完成了这

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

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

  • 首先,为单词集合构建一个trie
  • 将一个新节点添加到trie,使所有输入上的边从自身到自身
  • 对于trie中的每个丢失的字母转换,添加从开始节点到新的死节点的转换
  • (此时,对于这组单词,您现在有了一个(可能不是最小值)。)
  • 使用最小化DFA
  • 一旦你完成了这项工作,你将得到一个你感兴趣的单词集的DAWG

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

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


    希望这有帮助

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

  • 首先,为单词集合构建一个trie
  • 将一个新节点添加到trie,使所有输入上的边从自身到自身
  • 对于trie中的每个丢失的字母转换,添加从开始节点到新的死节点的转换
  • (此时,对于这组单词,您现在有了一个(可能不是最小值)。)
  • 使用最小化DFA
  • 一旦你完成了这项工作,你将得到一个你感兴趣的单词集的DAWG

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

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


    希望这有帮助

    我正在为一本字典做一个字典?所以重点是我应该首先构建一个trie?如果是这样的话,它会变得更容易,因为我有一些在书中创建trie的参考资料?我还没有完全理解算法。一些视觉帮助将不胜感激,或者一个链接。提前谢谢。@UsmanAmjed-我没有任何DFA最小化算法的可视化,因为该算法有点复杂。然而,老实说,编写代码并不难。至于构建trytes,我强烈建议不要尝试编写一个DAWG,直到您觉得使用trytes很舒服为止。尝试比DAWG简单得多,并提供相同的性能保证,但内存开销要高得多。我建议先读一下,是的,我会的。我正在编一本大约50万字的字典;内存开销会很大吗?我是不是应该去找哥们?就遍历etc而言,trie与尝试有很大的不同吗?@UsmanAmjed-与本例中的DAWG相比,trie肯定会有巨大的内存开销,因此压缩单词会很有用。不过,根据应用程序的不同,最好使用哈希表或其他结构;自动更正和拼写检查功能我正在为字典构建一个dawg?所以重点是我应该首先构建一个trie?如果是这样的话,它会变得更容易,因为我有一些在书中创建trie的参考资料?我还没有完全理解算法。一些视觉帮助将不胜感激,或者一个链接。提前谢谢。@UsmanAmjed-我没有任何DFA最小化算法的可视化,因为该算法有点复杂。然而,老实说,编写代码并不难。至于构造尝试,我强烈建议