Algorithm 如何构建增量有向无环词图来存储和搜索字符串?

Algorithm 如何构建增量有向无环词图来存储和搜索字符串?,algorithm,string,graph,Algorithm,String,Graph,我试图以简洁的方式存储大量字符串,以便能够非常快速地分析/搜索它们 有向无环词图(DAWG)非常适合这一目的。然而,我没有一个字符串列表要包括在第一位,所以它必须是可增量构建的。此外,当我搜索字符串时,我需要返回与结果相关联的数据(而不仅仅是一个布尔值表示是否存在) 我在这里找到了关于修改用于字符串数据跟踪的DAWG的信息:它看起来非常非常复杂,我不确定我是否能够编写它 我还发现了一些描述增量构建算法的研究论文,尽管我发现研究论文通常不是很有帮助 我认为我自己还不够先进,无法将这两种算法结合起来

我试图以简洁的方式存储大量字符串,以便能够非常快速地分析/搜索它们

有向无环词图(DAWG)非常适合这一目的。然而,我没有一个字符串列表要包括在第一位,所以它必须是可增量构建的。此外,当我搜索字符串时,我需要返回与结果相关联的数据(而不仅仅是一个布尔值表示是否存在)

我在这里找到了关于修改用于字符串数据跟踪的DAWG的信息:它看起来非常非常复杂,我不确定我是否能够编写它

我还发现了一些描述增量构建算法的研究论文,尽管我发现研究论文通常不是很有帮助


我认为我自己还不够先进,无法将这两种算法结合起来。是否已有具有这些特性的算法的文档,或具有良好内存使用和速度的替代算法?

您可能还需要查看此结构(可能构建一个新的结构)。这似乎是一个像样的“简单”替代结构

我提出这个建议有几个原因:

  • 我真的不完全了解你的结果
  • 绝对是增量建设
  • 叶节点可以包含所需的任何数据
  • 主观上,这是一个简单的算法
  • Java

    对于需要持久性的图形问题,我将看一看这个项目。Neo4j设计用于存储大型图形,并允许增量构建和修改数据,这似乎符合您描述的标准

    他们有一些很好的例子可以帮助你快速地解决问题,通常有一些示例代码可以帮助你解决大多数问题

    它们有一个在底部有一个链接的

    C++


    如果使用C++,图形生成/分析的通用解决方案是使用要持久化图形,您可以在GraphML(例如)中维护图形的基于文件的版本,并在图形更改时读取和写入该文件。

    我编写了ADTDAWG网页。在构造之后添加单词不是一个选项。该结构只不过是4个无符号整数类型的数组。它被设计为不可变的,以包含全部CPU缓存,并将多线程访问复杂性降至最低

    该结构是一个自动机,它形成一个最小且完美的哈希函数。它是在使用显式堆栈递归遍历时为提高速度而构建的

    发布时,它最多支持18个字符。包括所有26个英文字符将需要进一步扩充

    我的建议是使用标准的Trie,在每个节点中存储一个数组索引。是的,这看起来很幼稚,但是每个单词节点的结尾只代表一个单词。ADTDAWG是表示许多单词的传统DAWG中单词节点的每个末端的解决方案

    最小哈希表和完美哈希表不是那种可以随时组合在一起的东西


    我正在找其他工作,或者找份工作,所以请联系我,我会尽我所能。目前,我所能说的是,在经常变化的结构上使用大量优化是不现实的。

    尝试非常简单,但也会占用大量空间。有向无环单词图实际上只是一个trie,其中共享后缀被组合在一起,但这使得它们非常复杂。基数树可能是我最坏的情况。这看起来很酷,但我忘了提到我正在使用C++。A:我已经给C++添加了一个建议,这可能会有帮助。谢谢,JohnPaul。我很可能会使用一个基数树来存储字符串,尽管我希望节省更多的内存。我希望增量DAWG构建算法和字符串跟踪结构之间存在折衷,但我想不是!不幸的是,我不能给你工作或工作,因为这只是我的一个爱好项目。如果你想创建并记录一个灵活的结构来取乐,那就请便吧,祝你好运(至少我没有这个头脑)!