【问题标题】:Implementing pattern matching in a trie tree在 trie 树中实现模式匹配
【发布时间】:2020-04-22 17:21:46
【问题描述】:

我目前正在使用此堆栈溢出帖子中的 trie 实现:

Getting a list of words from a Trie

返回与给定前缀匹配的单词列表。然后我使用正则表达式过滤掉不符合整个指定模式的单词。

EX:如果我要搜索的模式是:CH??S?这是与我的初始前缀匹配的字典子集: {CHABAD、CHACHA、战车、CHATTED、Cheater、CHOMSKY、CHANNEL CHAFED、CHAFER、链条、椅子、奶酪、CHEESY CHRONO、CHUTES、凿子}

我会搜索带有“CH”前缀的特里树,然后过滤掉与我想要的 CH??S? 模式匹配的单词。 (奶酪,奶酪,凿子)并归还那些。

我想知道是否有更快的方法来避免在最后一步中使用正则表达式。我以为我可以使用后缀树 (Ukkonen's suffix tree algorithm in plain English) 或 boyer-moore 算法,但两者都不起作用,因为它们搜索的是后缀而不是模式。

【问题讨论】:

  • 你能把你的前缀搜索变成后缀搜索吗?对于CH??S?,搜索CH??,然后搜索所有这些加上S?

标签: java string data-structures pattern-matching trie


【解决方案1】:

这是一个很好的递归算法,您可以使用它消除使用最终正则表达式传递的需要。它通过将模式 P 与树 T 匹配来工作:

FindMatches(pattern P, tree T) {
    if (tree is empty) {
        return that there are no matches;
    }

    if (pattern is empty) {
        report a match if T is a word;
    } else if (pattern[0] is a letter) {
        FindMatches(P[1:], T.childFor(pattern[0]));
    } else if (pattern[0] is ?) {
        for (each child C of T) {
             gather matches from FindMatches(P[1:], C);
        }
        report all matches found this way;
    } else {
        something is wrong with your pattern;
    }
}

您只匹配CH 的方法与此方法一致。但是,当您到达匹配 ? 字符的地步时,您的方法只是执行 DFS 来查找当前点以下的所有单词,而这种方法只是在一个级别上分支并收集匹配项。换句话说,这种方法是“如果有明确的角色要跟随,则一次跟随一个角色”和“探索整个子树以寻找匹配”之间的混合体,战略性地关注分支。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多