python 字典树算法详解
字典树(Trie 树)是一种数据结构,用于高效地存储和检索字符串集合。它的基本思想是用树形结构来存储一组字符串,其中每个节点代表一个字符串的前缀,从根节点到叶子节点的路径表示一个字符串。每个节点包含一个字符和一个指向下一个节点的指针。
字典树的核心思想是前缀共享,即多个字符串的前缀可以共用一个节点。例如,假设有以下字符串集合:
["apple", "application", "banana", "band"]
它们可以被组织成如下的字典树:
root / | \ a b # / \ \ p # a / \ | p l n / \ / \ l e d # | | i a | | o n | | n d
在字典树中,每个节点代表一个字符,从根节点到叶子节点的路径表示一个字符串。节点上的 # 表示该节点是一个字符串的结尾。
实现一个字典树需要定义一个 TrieNode 类来表示每个节点,包含一个字符、一个布尔值表示是否是一个字符串的结尾,以及一个指向下一个节点的字典(Python 中的实现是一个字典)。
class TrieNode: def __init__(self): self.is_end = False self.children = {}
然后定义 Trie 类来管理字典树,包含一个根节点,以及插入字符串、搜索字符串等操作。
class Trie: def __init__(self): self.root = TrieNode() def insert(self, word): node = self.root for char in word: if char not in node.children: node.children[char] = TrieNode() node = node.children[char] node.is_end = True def search(self, word): node = self.root for char in word: if char not in node.children: return False node = node.children[char] return node.is_end def starts_with(self, prefix): node = self.root for char in prefix: if char not in node.children: return False node = node.children[char] return True
使用 Trie 类,可以插入字符串,搜索字符串,以及判断一个前缀是否是某个字符串的前缀。例如:
trie = Trie() trie.insert("apple") trie.insert("application") trie.insert("banana") trie.insert("band") print(trie.search("apple")) # True print(trie.search("band")) # True print(trie.search("ap")) # False print(trie.starts_with("ap")) # True
输出结果:
True True False True
字典树的时间复杂度为 O(m),其中 m 是字符串的长度。因此,字典树通常用于需要快速检索字符串的场合,如自动
相关文章