【问题标题】:what's the best data structure for pattern matching within a vocabulary?词汇表中模式匹配的最佳数据结构是什么?
【发布时间】:2013-07-20 10:52:18
【问题描述】:

给定一组词汇,可用于查找词汇中与给定子字符串匹配的所有单词的最佳数据结构是什么?

假设“Ap”是子字符串,
应返回“Apple”和“Application”。
由于在这种情况下,“Ap”在两个字符串的开头,我可以想到 Tries 的使用。

但是如果要匹配的子串可以在词汇表中的任何地方找到呢?
例如:如果给出“ap”,则还应返回“shape”,因为“ap”出现在“shape”中。

词汇集非常大。

【问题讨论】:

  • 什么定义最好?最快的,最小的。你试过什么。您可以通过利用约束进行优化,例如不区分大小写,但没有魔杖。
  • 我曾经为一个拼字游戏单词查找器做过类似的事情,但它有更多的限制需要优化,并且需要找到所有具有像 A?P 这样的模式的单词。它本质上将词汇表分解为列表字典的字典。所以我有一本包含所有带有 A 的单词的字典,其中包含一个列表字典,其中包含 A 在单词中的位置。占用了大量内存并需要一些时间来加载。

标签: data-structures pattern-matching trie


【解决方案1】:

你想要的是suffix tree。这会将(一组)字符串的所有后缀存储在一个特里(在您的情况下,是一组单词)。 trie 的每个叶子都与具有该后缀的字符串集相关联。

搜索子串时,只需匹配trie根的子串即可;您的子字符串必须是某个后缀的前缀,否则不匹配。发现匹配的存在是子字符串长度的线性时间。要确定 所有 个匹配词,您必须枚举从匹配完成点可访问的所有树的叶子。那是一个树行走问题;如果树有明显的分支,它可能会有点贵。

您可以为每个 trie 节点预先计算相关单词的集合;这可能非常大,但现在您可以非常快速地确定匹配的单词。

如果您只需要检查集合的成员,直到找到具有一些不错属性的成员,我会坚持使用枚举。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多