编写 Trie 树并实现搜索联想功能(如搜索引擎)

实现一个 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']

代码说明:

  1. TrieNode 类‌:

    • 每个节点包含一个  children 字典,用于存储子节点。
    • is_end_of_word 标记当前节点是否是一个完整单词的结尾。
  2. 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

请使用浏览器的分享功能分享到微信等