字典树/前缀树 Trie
前缀树是一种树结构,当一系列单词有很多公共前缀时就可以用前缀树来存储和查询,如果这些单词没有公共前缀,那么和用数组存是一样的。因为前缀树中节点通常用字典(Python中的dict,C++中的map)这个数据结构来存储子节点,所以常被称为字典树。前缀树是一种空间换时间的思想,这个和哈希表还有动态规划是一样的。
前缀树常常被用于基于前缀的模糊匹配,但其不局限于存储单词,树中的节点可以是任意的数据类型或者结构,比如前缀树会被用来解决最大异或值的问题,这时前缀树为二叉树,节点的值为0或者1。
前缀树只能用作基于前缀的模糊匹配,如果要做到匹配字符串中的某一段则要借助基于前缀树的AC自动机了,AC自动机融合了前缀树和KMP算法的思想。
前缀树的实现(Python)
class TrieNode:
"""前缀树中节点的数据结构"""
def __init__(self):
# count表示有多少个单词以当前节点为结尾
self.count = 0
# pre_count表示以根节点到当前节点为前缀的单词个数
self.pre_count = 0
# children存储所有当前节点的下一个节点
self.children = {
}
class Trie:
"""前缀树的实现"""
def __init__(self):
# 定义前缀树的根节点
self.root = TrieNode()
def insert(self, word):
"""向前缀树中添加单词"""
node = self.root
for ch in word:
if ch not in node.children:
node.children[ch] = TrieNode()
node = node.children[ch]
node.pre_count += 1
node.count += 1
def search(self, word):
"""查找word是否位于前缀树内"""
node = self.root
for ch in word:
if ch not in node.children:
return False
node = node.children[ch]
return node.count > 0
def start_with(self, prefix):
"""判断prefix是否为前缀树中的前缀"""
node = self.root
for ch in prefix:
if ch not in