Python 字典树的代码实现与开源项目
一. 字典树(Trie)是什么?
字典树(Trie),又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。常用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
二. 字典树的代码实现
下面是 Python 字典树的基本实现:
class TrieNode: def __init__(self): """ Trie 节点结构体 """ self.children = dict() self.is_end = False # 整个单词存储在叶子节点 class Trie: def __init__(self): """ 初始化 Trie """ self.root = TrieNode() def insert(self, word: str) -> None: """ 插入一个单词 """ node = self.root for w in word: if w not in node.children: node.children[w] = TrieNode() node = node.children[w] node.is_end = True def search(self, word: str) -> bool: """ 查找一个单词是否存在 """ node = self.root for w in word: if w not in node.children: return False node = node.children[w] return node.is_end def starts_with(self, prefix: str) -> bool: """ 查找前缀为 prefix 的单词是否存在 """ node = self.root for p in prefix: if p not in node.children: return False node = node.children[p] return True
在上面的代码实现中,TrieNode 是字典树节点的结构体,包含两个属性:
- children:该节点的子节点,是一个字典,键为子节点的字符,值为子节点的 TrieNode 对象。
- is_end:是否为一个完整单词的结尾(即该节点是否为叶子节点)。
Trie 类是字典树的主体,包含三个方法:
- init: 初始化 Trie,创建根节点。
- insert: 插入一个单词到 Trie 树中,从根节点开始遍历并插入需要插入的单词字母,直到单词的最后一个字母形成一个叶子节点。is_end 设为 True。
- search: 在 Trie 树中查找一个单词是否存在,与 insert 操作完全一样,遍历单词的每个字母,并沿着 Trie 树向下移动一步,直到最后一个字母,看是否可以在 Trie 树中找到每个字母节点。
- starts_with: 查找 Trie 树中是否有以给定前缀开头的单词,该方法与 search 方法类似,只是在查找 Trie 树叶子节点之前,根据给定的前缀沿着 Trie 树下移。
三. 开源项目
如果你想要更多的字典树相关实现代码,可以参考 GitHub 上的以下 Python 开源项目:
- pytrie
- ahocorasick
- pygtrie
这些开源项目提供标准实现,通常包含更多功能和优化选项,可以根据自己的需要选择适合的。
相关文章