String DAWG/DAFSA中的元信息

String DAWG/DAFSA中的元信息,string,dictionary,data-structures,finite-automata,dawg,String,Dictionary,Data Structures,Finite Automata,Dawg,我想为动态字符串实现一个字符串查找数据结构,它将支持高效的搜索和插入。目前,我正在使用trie,但如果可能的话,我希望减少内存占用。描述了一个DAWG/DAFSA,它通过压缩后缀显然可以在trie上节省大量空间。然而,虽然它将清楚地测试字符串是否合法,但我并不清楚是否有任何方法可以排除非法字符串。例如,在“t”和“e”为终端状态的情况下,使用“引用”和“cat”两个词,DAWG/DAFSA将如下所示: c / \ a i \ / t

我想为动态字符串实现一个字符串查找数据结构,它将支持高效的搜索和插入。目前,我正在使用trie,但如果可能的话,我希望减少内存占用。描述了一个DAWG/DAFSA,它通过压缩后缀显然可以在trie上节省大量空间。然而,虽然它将清楚地测试字符串是否合法,但我并不清楚是否有任何方法可以排除非法字符串。例如,在“t”和“e”为终端状态的情况下,使用“引用”和“cat”两个词,DAWG/DAFSA将如下所示:

      c
     / \
    a   i
     \ /
      t
      |
      e
如果没有一些元信息,“cit”和“cate”将被错误地识别为合法字符串

问题:

1) 在DAWG/DAFSA中是否有存储字符串/路径(如合法性)元信息的首选方法


2) 如果DAWG/DAFSA不符合要求(高效搜索/插入和存储元信息),那么最好使用什么样的数据结构?一个最小的内存占用是很好的,但可能不是绝对必要的。

在DAWG中,只有当状态之间完全无法区分时,才将它们压缩在一起。这意味着您实际上不会将CAT的t节点合并在一起并引用到一起,原因正是您注意到的——这会导致CIT出现假阳性或CAT出现假阴性

当您有大量具有通用后缀的单词时,DAWG通常对静态词典最有效。例如,一个适用于所有英语的DAWG可以通过将复数单词末尾的所有后缀“s”与动名词中的大多数“ING”后缀组合起来,节省大量空间。如果要执行大量的插入或删除操作,DAWG几乎肯定是错误的数据结构,因为从DAWG中添加或删除单个字可能会产生连锁反应,需要将以前组合的许多分支拆分,反之亦然

老实说,对于大小合理的数据集,trie并不是一个糟糕的调用。所有英语的trie只会占用26MB左右的内存,这并不多。我只会在空间使用率确实很高的情况下使用DAWG,并且您不需要做很多插入或删除操作


希望这有帮助

肯定有帮助。非常感谢。维基百科的文章根本没有提到假阳性/假阴性的问题。我的字符串不限于英语单词,因此我担心在没有计划进行修剪或其他维护的情况下实现trie的长期后果,这让我想知道如何实现一些压缩。26 MB可能是可以承受的,但在减少内存占用的同时,我们可能也在改进查找时间,因为更大比例的字典可以放入缓存中。在DAWG-DAFSA中,符号是边,而不是节点。