【问题标题】:Prefix search in a Trie dictionaryTrie 字典中的前缀搜索
【发布时间】:2020-01-01 16:30:55
【问题描述】:

我有一个样本字典

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

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

  1. 'AP' -> "APPLE", "APPLES" "APE", "APPLIES"

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

  3. 'APPLE' -> "APPLE", "APPLES"

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

【问题讨论】:

  • “我没有得到正确的结果”不是很具有描述性。请展示您尝试过的方法并准确描述失败的原因。
  • @glibdud 我尝试了几种方法。但它甚至不接近我想要的。这就是我没有发布它的原因。
  • 不幸的是,就目前而言,您似乎只是在要求其他人为您完成工作。它通常有助于证明您已经自己付出了一些努力。
  • '*':False 会不会出现在 dict 中?如果是,这意味着什么(它和'*':True 有什么区别)?
  • @CristiFati 我刚刚添加它表示它是单词的结尾。如果遇到'*',那么它就是路径的结尾。

标签: python search trie


【解决方案1】:

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

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']

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      相关资源
      最近更新 更多