我正在尝试以简洁的方式存储大量字符串,以便可以非常快速地分析/搜索它们。
有向无环字图(DAWG)非常适合这个目的。但是,我没有首先要包含的字符串列表,因此必须以增量方式构建。另外,当我在搜索字符串时,我需要返回与结果相关的数据(不仅仅是一个布尔说,如果它存在)。
我在这里找到了有关字符串数据跟踪的DAWG修改的信息:http://www.pathcom.com/~vadco/adtdawg.html它看起来极其复杂,我不确定我是否有能力编写它。
我还发现了一些描述增量构建算法的研究论文,不过我发现研究论文一般都没有用。
我认为我不够先进,无法自己将这两种算法结合起来。是否存在具有这些特征的算法的文档,或具有良好存储器使用的替代算法&速度ω
答案 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)。它似乎是一个体面的“简单”替代结构。
我建议这样做有几个原因: