当前位置: 首页 > news >正文

PythonTrie前缀树实现


============================================================
Python Trie前缀树实现 — 节点定义/插入搜索/自动补全/通配符
============================================================

Trie(前缀树/字典树)是一种高效的字符串检索结构,利用字符串的公共前缀来
减少查询时间。广泛应用于自动补全、拼写检查、IP路由等场景。

============================================================
1. Trie 节点定义
============================================================

class TrieNode:
"""前缀树节点类"""
def __init__(self):
self.children = {} # 子节点字典 {字符: TrieNode}
self.is_end = False # 标记此节点是否为某个单词的结尾
self.count = 0 # 经过此节点的单词数量(用于统计)

class Trie:
"""前缀树类"""
def __init__(self):
self.root = TrieNode()

============================================================
2. 插入操作(Insert)
============================================================

def insert(self, word):
"""向Trie中插入一个单词"""
node = self.root
for ch in word:
if ch not in node.children:
node.children[ch] = TrieNode() # 创建新节点
node = node.children[ch]
node.count += 1 # 经过此节点的单词数+1
node.is_end = True # 标记单词结尾

============================================================
3. 搜索操作(Search)
============================================================

def search(self, word):
"""精确搜索:判断word是否在Trie中"""
node = self._find_node(word)
return node is not None and node.is_end

def _find_node(self, prefix):
"""找到前缀对应的最后一个节点(辅助方法)"""
node = self.root
for ch in prefix:
if ch not in node.children:
return None # 前缀不存在
node = node.children[ch]
return node

def starts_with(self, prefix):
"""判断是否存在以prefix为前缀的单词"""
return self._find_node(prefix) is not None

============================================================
4. 删除操作(Delete)
============================================================

def delete(self, word):
"""从Trie中删除一个单词"""
def _delete(node, word, depth):
"""递归删除,自底向上清理无用节点"""
if depth == len(word):
if not node.is_end: # 单词不存在
return False
node.is_end = False # 取消单词结尾标记
return len(node.children) == 0 # 如果是叶子节点则返回True
ch = word[depth]
if ch not in node.children:
return False # 单词不存在
should_delete = _delete(node.children[ch], word, depth + 1)
if should_delete:
del node.children[ch] # 删除无用节点
node.count -= 1
return len(node.children) == 0 and not node.is_end
node.count -= 1
return False
_delete(self.root, word, 0)

============================================================
5. 自动补全实现(Auto-Complete)
============================================================

def auto_complete(self, prefix):
"""返回所有以prefix开头的单词"""
node = self._find_node(prefix)
if not node:
return [] # 没有匹配前缀
results = []
self._dfs_collect(node, list(prefix), results)
return results

def _dfs_collect(self, node, path_chars, results):
"""DFS收集所有以当前节点为前缀的完整单词"""
if node.is_end:
results.append(''.join(path_chars)) # 当前路径是一个完整单词
for ch in sorted(node.children): # 按字母顺序遍历
path_chars.append(ch)
self._dfs_collect(node.children[ch], path_chars, results)
path_chars.pop() # 回溯

============================================================
6. 通配符搜索(Word Search with Wildcard)
============================================================

def search_with_wildcard(self, word):
"""搜索支持通配符 '.' 匹配任意单个字符"""
def _search(node, word, idx):
if idx == len(word):
return node.is_end
ch = word[idx]
if ch == '.':
# 通配符:尝试所有子节点
for child in node.children.values():
if _search(child, word, idx + 1):
return True
return False
else:
if ch not in node.children:
return False
return _search(node.children[ch], word, idx + 1)
return _search(self.root, word, 0)

============================================================
7. 前缀匹配统计
============================================================

def prefix_count(self, prefix):
"""统计有多少个单词以prefix为前缀"""
node = self._find_node(prefix)
if not node:
return 0
# 统计以该节点为根的子树中所有单词的数量
def _count_words(node):
total = 1 if node.is_end else 0
for child in node.children.values():
total += _count_words(child)
return total
return _count_words(node)

def word_count(self):
"""返回Trie中单词总数"""
return self.prefix_count('')

============================================================
8. Trie vs set 性能对比
============================================================
# Trie的优势:
# - 前缀搜索(starts_with、auto_complete)是Trie的独有能力
# - 在大量字符串的公共前缀很长时更省内存
# - O(L)时间复杂度,L为单词长度,与存储的单词数量无关
#
# set/dict的优势:
# - 精确查找速度更快(哈希表O(1) vs Trie O(L))
# - 内存占用通常更小(没有额外的指针开销)
# - Python内置,使用更方便

============================================================
使用示例
============================================================
if __name__ == "__main__":
trie = Trie()
words = ["苹果", "苹果手机", "苹果电脑", "安卓", "安卓系统", "香蕉"]
for w in words:
trie.insert(w)

print("搜索'苹果':", trie.search("苹果")) # True
print("搜索'橘子':", trie.search("橘子")) # False
print("前缀'苹果':", trie.starts_with("苹果")) # True

# 自动补全测试
suggestions = trie.auto_complete("苹果")
print("'苹果'的补全建议:", suggestions) # ['苹果', '苹果手机', '苹果电脑']

# 通配符搜索(英文示例)
eng_trie = Trie()
for w in ["cat", "car", "bat", "bar", "catalog"]:
eng_trie.insert(w)
print("通配符c.t:", eng_trie.search_with_wildcard("c.t")) # True (cat)
print("通配符.og:", eng_trie.search_with_wildcard(".og")) # False (无匹配)

# 前缀统计
print("'苹果'相关的单词数:", trie.prefix_count("苹果")) # 3

# 删除测试
trie.delete("苹果")
print("删除'苹果'后搜索:", trie.search("苹果")) # False
print("删除后'苹果手机'仍然存在:", trie.search("苹果手机")) # True

http://www.jsqmd.com/news/911633/

相关文章:

  • 互联网大厂 Java 求职面试:音视频流处理与微服务架构相关技术探讨
  • 2026更新版!AI论文网站测评:最新工具推荐与使用对比
  • GTKWave波形查看保姆级教程:从Verilator生成的VCD文件到高效调试信号(Linux/Ubuntu环境)
  • Navicat重置工具终极指南:实现Mac版无限免费试用
  • 5分钟快速上手DistroAV:让OBS Studio变身专业级NDI直播系统
  • 杭州莫干山全屋定制哪家好?本地靠谱门店盘点,装修定制优选推荐 - 商业新知
  • 【 linux 】动静态库的制作
  • UniAR:统一预测人类视觉注意力与主观反馈的多模态模型
  • 往届上岸学员力荐!2026外科主任医师考试的金牌授课名师! - 医考机构品牌测评专家
  • 基于FutureBoard与2.4GHz无线通信的物联网项目实践
  • 终极指南:如何用VideoDownloadHelper三步轻松下载网页视频
  • 2026最新克隆他人声音AI工具排名 多款高适配创作工具深度测评 - 企业推荐官【官方】
  • 基于图像识别的游戏自动化架构深度解析:E7Helper技术实现原理与设计哲学
  • 022、YOLOv11 C3k2 模块源码级解析:为什么替换 C2f 能提速还能涨点
  • Java求职面试:互联网大厂的技术栈考验与幽默解答
  • 视听语音增强:从算法原理到短视频降噪的工程实践
  • 2026亲测:专业降AIGC软件这款就对了一键达标
  • 在安卓开发中快速接入大模型API,使用Taotoken实现智能代码补全
  • 如何为OBS Studio搭建专业级无线视频传输系统:DistroAV完全指南
  • 2026上海App软件开发公司TOP10推荐,一线大厂与实力派企业全解析
  • 美国移民项目有哪些:常见类型及申请要点解析 - 品牌排行榜
  • 科普|电缆故障如何预定位?鼎讯信通 DLC-1 详解
  • 2026年最受好评的高温含硅脱模剂品牌推荐 - 企业推荐官【官方】
  • 从零开始:互联网大厂 Java 求职者面试之旅——技术栈与场景分析
  • Windows内存优化终极指南:用Mem Reduct让老旧电脑重获新生
  • 终极指南:用Ncorr破解材料变形测量的技术瓶颈
  • 如何快速使用AzurLaneAutoScript:碧蓝航线全自动脚本的终极指南
  • d2s-editor技术深度解析:暗黑破坏神2存档编辑器的实现原理与架构设计
  • 郑州市管城区家电维修清洗|维小达 专业空调、冰箱、洗衣机、热水器、电视、油烟机、灶具、消毒柜、小家电维修清洗一站式服务 - 维小达科技
  • 深度拆解2026年GEO优化系统部署源头优选底层逻辑 全维度盘点高效稳定GEO优化软件服务商 - GEO贴牌代理