如何创建DAWG
How to create a DAWG?
如何创建 dawg ?我发现有两种方法。一个是将一个Trie转换为Dawg,另一个正在立即创建新的Dawg?哪一个最简单?您能详细说明两者并提供一些链接吗?
思考dawg的一种方法是作为单词列表中所有单词的最低状态DFA。结果,用于构建DAWG的传统算法如下:
- 首先构建一个文字收集的trie。
- 在所有输入上从自身到本身的边缘添加一个新节点。
- 对于Trie中的每个缺少字母过渡,请添加从开始节点到这个新的死节点的过渡。
- (在这一点上,您现在有一个(可能是非最小值) dfa 对于单词集。)
- 使用最小化DFA> DFA状态最小化的标准算法。
完成此操作后,您将为您感兴趣的一组单词留下DAWG。
该算法的运行时如下。可以通过为所有原始单词构造一个TRIE来完成构建初始DFA(这需要时间O(n),其中n是所有输入字符串中字符的总数),然后填充丢失的过渡(需要时间)o(n |σ |),其中|σ |是字母中不同字符的数量)。从那里,最小化算法在时间O(N 2 |σ |)中运行。这意味着该算法的总运行时为O(n 2 |σ |)。
据我所知,没有直接算法可以逐步构建DAWG。通常,仅当您已经提前所有单词时,才会为一组单词构建DAWG。直觉上,这是正确的,因为插入一个新词在DAWG中已经存在一些后缀可能需要大量重组DAWG,以使某些旧的接受状态不接受,反之亦然。从理论上讲,这是因为插入新单词可能会大大改变DFA的区分性关系的等价类别,这可能需要对DFA的结构进行实质性更改。
希望这会有所帮助!
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 如何创建DAWG