0%

python实现Trie(字典树、前缀树)

wiki 百科上的介绍:

Trie,字典树,也叫前缀树。是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,尔根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和比分内部节点所对应的键才有相关的值。

应用:

trie常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。

要实现的方法

一般来讲trie要实现这么几个方法

  • 插入一个单词insert(word: str) -> None
  • 查找一个单词是否在trie中search(word:str) -> bool
  • 查找一个前缀是否在trie中startsWith(prefix:str) -> bool

leetcode上的208题实现trie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Trie:

def __init__(self):
"""
Initialize your data structure here.
"""
self.root = {}
self.end_of_word = '#'

def insert(self, word: str) -> None:
"""
Inserts a word into the trie.
"""
node = self.root
for char in word:
node = node.setdefault(char, {})
node[self.end_of_word] = self.end_of_word

def search(self, word: str) -> bool:
"""
Returns if the word is in the trie.
"""
node = self.root
for char in word:
if char not in node:
return False
node = node[char]
return self.end_of_word in node

def startsWith(self, prefix: str) -> bool:
"""
Returns if there is any word in the trie that starts with the given prefix.
"""
node = self.root
for char in prefix:
if char not in node:
return False
node = node[char]
return True

通常情况下没有必要使用一个trie node表示一个trie的节点,存入hash表和是否是结尾。结尾可以用一个特殊字符代替,判断这个字符是否在hash表中。这样每一个节点其实都是一个hash表。