繁体   English   中英

在 Trie 字典中搜索前缀

[英]Prefix search in a Trie dictionary

我有一个示例字典

    {  
   'A':{  
      'P':{  
         'P':{  
            'L':{  
               'I':{  
                  'E':{  
                     'S':{  
                        '*':True
                     }
                  }
               },
               'E':{  
                  'S':{  
                     '*':True
                  },
                  '*':True
               }
            }
         },
         'E':{  
            '*':True
         }
      }
   }
}

这里{*:True}表示单词的结尾。 我需要找到我可以从字典中以前缀开头的所有可能的单词。 例如,我可以从上面带有各种前缀的字典中生成的单词如下。

  1. 'AP' - > “苹果”、“苹果”、“猿”、“苹果”

  2. 'APP' -> "APPLE", "APPLES", "APPLIES"

  3. “苹果”->“苹果”,“苹果”

我基本上是在尝试使用字典实现Trie数据结构并执行前缀搜索。 我想我应该实现一些递归算法来找到所有可能的结果。 我无法弄清楚如何实现它。

我很好奇并想出了这个递归变体:

tree = {
    "A": {
        "P": {
            "P": {
                "L": {
                    "I": {"E": {"S": {"*": True}}},
                    "E": {"S": {"*": True}, "*": True},
                }
            },
            "E": {"*": True},
        }
    }
}


def descend(node, prefix=""):
    if prefix and prefix[-1] == "*":
        print(prefix[:-1])
        return
    for letter, node in node.items():
        descend(node, prefix + letter)


descend(tree)

它打印:

APPLIES
APPLES
APPLE
APE

您可以将递归与生成器一起使用:

data = {'A': {'P': {'P': {'L': {'I': {'E': {'S': {'*': True}}}, 'E': {'S': {'*': True}, '*': True}}}, 'E': {'*': True}}}}
def combos(d, c = []):
  for a, b in d.items():
    yield from [''.join(c)] if isinstance(b, bool) else combos(b, c+[a])


print(list(combos(data['A']['P'], ['A', 'P'])))

输出:

['APPLIES', 'APPLES', 'APPLE', 'APE']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM