实现一个 Trie 树(前缀树)并支持搜索联想功能是一个经典的计算机科学问题。Trie 树是一种用于高效存储和检索字符串集合的数据结构,特别适合用于实现自动补全和搜索联想功能。下面是一个 Python 实现的 Trie 树,包括插入和搜索联想功能:
pythonCopy Codeclass TrieNode: def __init__(self): # 子节点字典
self.children = {} # 标记是否为完整单词
self.is_end_of_word = Falseclass Trie: def __init__(self): # 初始化根节点
self.root = TrieNode() def insert(self, word): """插入一个单词到 Trie 树中"""
node = self.root for char in word: if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_end_of_word = True
def _search_node(self, prefix): """查找前缀对应的节点"""
node = self.root for char in prefix: if char not in node.children: return None
node = node.children[char] return node def search(self, word): """检查单词是否在 Trie 树中"""
node = self._search_node(word) return node is not None and node.is_end_of_word def starts_with(self, prefix): """检查是否存在以给定前缀开头的单词"""
return self._search_node(prefix) is not None
def _collect_suggestions(self, node, prefix, results): """递归收集所有可能的单词"""
if node.is_end_of_word:
results.append(prefix) for char, child_node in node.children.items():
self._collect_suggestions(child_node, prefix + char, results) def suggest(self, prefix): """根据前缀返回所有可能的单词"""
node = self._search_node(prefix) if not node: return []
results = []
self._collect_suggestions(node, prefix, results) return results# 示例使用trie = Trie()
words = ["apple", "app", "application", "bat", "ball", "batman"]for word in words:
trie.insert(word)# 搜索功能print(trie.search("app")) # 输出: Trueprint(trie.search("appl")) # 输出: False# 前缀匹配功能print(trie.starts_with("app")) # 输出: True# 搜索联想功能print(trie.suggest("app")) # 输出: ['app', 'apple', 'application']print(trie.suggest("bat")) # 输出: ['bat', 'ball', 'batman']
代码说明:
-
TrieNode 类:
- 每个节点包含一个
children字典,用于存储子节点。 -
is_end_of_word标记当前节点是否是一个完整单词的结尾。
- 每个节点包含一个
-
Trie 类:
-
insert方法用于插入单词。 -
_search_node是一个辅助方法,用于查找给定前缀的最后一个节点。 -
search方法检查一个单词是否在 Trie 树中。 -
starts_with方法检查是否存在以给定前缀开头的单词。 -
_collect_suggestions是一个递归辅助方法,用于收集从给定节点开始的所有可能单词。 -
suggest方法根据前缀返回所有可能的单词。
-
使用示例:
- 插入了一些单词后,可以使用
search方法检查单词是否存在。 - 使用
starts_with方法检查是否存在以某个前缀开头的单词。 - 使用
suggest方法获取所有以某个前缀开头的可能单词,实现搜索联想功能。
这种实现方式非常适合用于实现自动补全和搜索建议功能,如搜索引擎或代码编辑器的智能提示。
http://keji.liyintong.com
http://keji.naqimai.cn
http://keji.kucedu.cn
http://keji.yueluyan.cn
http://keji.huayuke.cn
http://keji.haizichu.cn
http://keji.yawanmei.cn
http://keji.biaolele.cn
http://keji.shenhebu.cn
http://keji.zimeiren.cn
http://keji.qishouka.cn
http://keji.ruanding.cn
http://keji.xjhsdsc.cn
http://keji.itoren.cn
http://keji.iseebest.cn
http://keji.bndaye.cn
http://keji.rustler.cn
http://keji.excelta.cn
http://keji.diaolift.cn
http://keji.jxpfbyjs.cn
http://keji.banans.cn
http://keji.aspira.cn
http://keji.bxhqw.cn
http://keji.pudiweng.cn
http://keji.tingbu.cn
http://keji.ouhei.cn
http://keji.huiha.cn
http://keji.miuling.cn
http://keji.podang.cn
http://keji.fenkun.cn
http://keji.liangran.cn
http://keji.zouliu.cn
http://keji.xuhou.cn
http://keji.kuopao.cn
http://keji.lunkai.cn
http://keji.zhaiti.cn
http://keji.fogei.cn
http://keji.gengluo.cn
http://keji.wadiao.cn
http://keji.hunjun.cn
http://keji.huanken.cn
http://keji.chuancong.cn
http://keji.buzun.cn
http://keji.zhuozou.cn
http://keji.lazai.cn
http://keji.zengle.cn
http://keji.suidun.cn
http://keji.zhaojunji.cn
http://keji.huihuoban.cn
http://keji.wanjiahua.cn
http://keji.conglinyi.cn
http://keji.henyoupin.cn
http://keji.wuwenkang.cn
http://keji.tujiachen.cn
http://keji.zilaoweng.cn
http://keji.baolema.cn
http://keji.shumeilin.cn
http://keji.anhetong.cn
http://keji.wenjishu.cn
http://keji.kansande.cn
http://keji.yueshijie.cn
http://keji.tihujiu.cn
http://keji.huatoutou.cn
http://keji.xiaolaige.cn
http://keji.huguangu.cn
http://keji.lvdate.cn
http://keji.kesini.cn
http://keji.soubianlu.cn
http://keji.fuenbu.cn
http://keji.liuyakun.cn
http://keji.zouyizou.cn
http://keji.juyingba.cn
http://keji.namahu.cn
http://keji.dadudu.cn
http://keji.xuewenzi.cn
http://keji.lazhuyong.cn
http://keji.aizishu.cn
http://keji.nianjiepo.cn
http://keji.baisuijie.cn
http://keji.wanyuecun.cn
http://keji.shoupashu.cn
http://keji.hetongmei.cn
http://keji.ouenming.cn
http://keji.qianyiduo.cn
http://keji.yidingzhi.cn
http://keji.zouyuming.cn
http://keji.mofaya.cn
http://keji.hexiangru.cn
http://keji.quyouban.cn
http://keji.mingyinsi.cn
http://keji.junepan.cn
http://keji.qiyuehong.cn
http://keji.ledatong.cn
http://keji.chenqinga.cn
http://keji.ebuyun.cn
http://keji.gayijiu.cn
http://keji.liqinge.cn
http://keji.liubawan.cn
http://keji.huabaohan.cn
http://keji.aiguandan.cn
http://keji.judoubang.cn
http://keji.huachenyu.cn
http://keji.hexiaolia.cn
http://keji.feiyuxuan.cn
http://keji.zhenwasai.cn
http://keji.maoweilai.cn
http://keji.yunyuewei.cn
http://keji.kemensen.cn
http://keji.anxinyuan.cn
http://keji.deyisheji.cn
http://keji.ximaguohe.cn
http://keji.gewukeji.cn
http://keji.rehuang.cn