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

时间:2010-02-21 21:55:13

标签: algorithm string graph

我正在尝试以简洁的方式存储大量字符串,以便可以非常快速地分析/搜索它们。

有向无环字图(DAWG)非常适合这个目的。但是,我没有首先要包含的字符串列表,因此必须以增量方式构建。另外,当我在搜索字符串时,我需要返回与结果相关的数据(不仅仅是一个布尔说,如果它存在)。

我在这里找到了有关字符串数据跟踪的DAWG修改的信息:http://www.pathcom.com/~vadco/adtdawg.html它看起来极其复杂,我不确定我是否有能力编写它。

我还发现了一些描述增量构建算法的研究论文,不过我发现研究论文一般都没有用。

我认为我不够先进,无法自己将这两种算法结合起来。是否存在具有这些特征的算法的文档,或具有良好存储器使用的替代算法&速度ω

3 个答案:

答案 0 :(得分:7)

我写了ADTDAWG网页。在施工后添加单词不是一种选择。该结构只不过是4个无符号整数类型的数组。它被设计为包含总CPU缓存的不可变,以及最小的多线程访问复杂性。

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

已发布,最多支持18个字符。包括所有26个英文字符将需要进一步增加。

我的建议是使用标准Trie,每个节点都存储一个数组索引。 Ya,它似乎是婴儿,但每个END_OF_WORD节点只代表一个单词。 ADTDAWG是传统DAWG中每个END_OF_WORD节点的解决方案,代表许多单词。

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

我正在寻找其他工作或工作,所以请联系我,我会尽我所能。现在,我可以说的是,对可能经常更改的结构进行大量优化是不现实的。

答案 1 :(得分:1)

<强>爪哇

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

他们有一些很好的例子可以让你快速前进,并且通常会有一些示例代码来帮助您解决大多数问题。

他们有一个DAG example,在full source code的底部有一个链接。

<强> C ++

如果您使用的是C ++,图表构建/分析的常用解决方案是使用Boost graph library。要保留图形,您可以在GraphML中维护基于文件的图形版本(例如),并在图形更改时读取和写入该文件。

答案 2 :(得分:0)

您可能还想查看trie结构(可能会构建radix-tree)。它似乎是一个体面的“简单”替代结构。

我建议这样做有几个原因:

  1. 我真的不完全了解你的结果。
  2. 绝对建设增量。
  3. Leaf节点可以包含您希望的任何数据。
  4. 主观,一种简单的算法。