【问题标题】:Meta-information in DAWG/DAFSADAWG/DAFSA 中的元信息
【发布时间】:2015-02-16 11:52:28
【问题描述】:

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

      c
     / \
    a   i
     \ /
      t
      |
      e

并且“cit”和“cate”将被错误地识别为没有一些元信息的合法字符串。

问题:

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

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

【问题讨论】:

  • 在 DAWG-DAFSA 中,符号是边,而不是节点。

标签: string dictionary data-structures finite-automata dawg


【解决方案1】:

在 DAWG 中,只有当它们彼此完全无法区分时,才能将它们压缩在一起。这意味着您实际上不会将 CAT 和 CITE 的 T 节点组合在一起,这正是您所指出的原因 - 这会给您在 CIT 上的假阳性或在 CAT 上的假阴性。

当您拥有大量具有共同后缀的单词时,DAWG 通常对静态词典最有效。例如,适用于所有英语的 DAWG 可以通过将复数词末尾的所有后缀“s”和动名词中的大多数“ING”后缀组合在一起来节省大量空间。如果您要进行大量插入或删除操作,DAWG 几乎肯定是不适合这项工作的数据结构,因为从 DAWG 中添加或删除单个单词会导致涟漪效应,需要之前合并的大量分支分开,反之亦然。

老实说,对于大小合理的数据集,trie 并不是一个糟糕的选择。对所有英语的 trie 只会使用 26MB 之类的东西,这不是很多。如果空间使用确实非常宝贵,并且您没有进行很多插入或删除操作,我只会使用 DAWG。

希望这会有所帮助!

【讨论】:

  • 绝对有帮助。非常感谢。维基百科的文章根本没有解决误报/否定的问题。我的字符串不限于英文单词,所以我担心在没有计划修剪或其他维护的情况下实施 trie 的长期后果,这让我想知道是否要实施一些压缩。
  • 26 MB 可能是负担得起的,但在减少内存占用的同时,我们也可能会缩短查找时间,因为更大比例的字典可以放入缓存中。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 2013-08-02
  • 2015-05-12
  • 2013-08-30
  • 2019-02-17
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
相关资源
最近更新 更多