Python中的树形数据结构: 前缀树
前缀树又称 Trie 树,是一种树形结构,用于处理字符串匹配问题。它的优点在于能够快速进行字符串的查找、插入和删除操作。
以下是 Python 中使用前缀树实现字符串查找的示例代码:
class TrieNode: def __init__(self): self.children = {} self.is_word = False class Trie: def __init__(self): self.root = TrieNode() def insert(self, word): node = self.root for c in word: if c not in node.children: node.children[c] = TrieNode() node = node.children[c] node.is_word = True def search(self, word): node = self.root for c in word: if c not in node.children: return False node = node.children[c] return node.is_word t = Trie() t.insert("pidancode") t.insert("皮蛋编程") print(t.search("pidancode")) # True print(t.search("pi")) # False
在上面的示例代码中,我们定义了两个类:TrieNode 和 Trie。TrieNode 用于表示前缀树节点,包含一个 children 字典和一个 is_word 布尔值。Trie 类则包含一个根节点和两个方法:insert 和 search。
在 insert 方法中,我们遍历要插入的字符串中的每个字符,判断其是否在当前节点的 children 中。如果不在,则在 children 中新建一个 TrieNode;如果已存在,则继续遍历下一个字符。最后,将最后一位的 is_word 置为 True。
在 search 方法中,我们同样遍历要搜索的字符串中的每个字符,判断其是否在节点的 children 中。如果存在,则将节点指向该字符所在的子节点;如果不存在,则说明该字符串不在前缀树中,返回 False。最后,判断最后一个节点的 is_word 是否为 True,如果是则返回 True,否则返回 False。
在前缀树中,所有具有共同前缀的字符串会被保存在同一个分支上,这使得字符串查找非常高效。在本例中,"pidancode" 和 "皮蛋编程" 都拥有相同的前缀 "pi",因此它们在前缀树的结构中也共享同一个节点。
相关文章