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

前缀树 C++实现

背景彻底搞懂前缀树Trie搜索联想、敏感词过滤的底层神器日常上网时我们经常会遇到这些场景在浏览器、输入法输入几个字自动弹出相关联想词条APP 后台自动过滤文本中的违规敏感词路由器快速匹配 IP 最长前缀完成路由转发这些看似毫不相关的功能底层都依赖同一个经典数据结构——前缀树Trie也叫字典树。很多人觉得树结构复杂难懂但前缀树绝对是「入门简单、威力极大」的特例。今天我们用最通俗的语言从零吃透前缀树的核心原理、操作流程、代码实现、实战场景。一、什么是前缀树一句话核心定义前缀树是一种专门针对字符串设计的多叉树核心思想只有八个字共享前缀、按需分叉。和普通数组、哈希表存储字符串不同前缀树不会单独存储每一个完整单词而是将所有字符串的公共前缀合并存储不同后缀单独分叉极致节省存储空间同时实现高效的前缀匹配。前缀树核心结构规则根节点为空不存储任何字符是所有字符串的起始入口每条边代表一个字符父子节点的连线对应单个字母/字符节点带结束标记每个节点可以标记「是否为单词末尾」用来区分「前缀」和「完整单词」。直观示例我们存入 3 个单词app、apple、apply普通存储需要完整存储 3 个字符串重复的 app 前缀重复占用空间前缀树存储共享 a→p→p 公共前缀后续仅分叉 l→e、l→y大幅压缩空间。树形结构示意根节点 └─ a └─ p └─ p✅ 单词结尾app └─ l ├─ e✅ 单词结尾apple └─ y✅ 单词结尾apply二、为什么要用前缀树对比传统结构处理字符串查找、前缀匹配我们最常用的是数组遍历 和 哈希表HashMap但二者都有明显短板。数组遍历每次匹配前缀都需要遍历所有单词数据量越大速度越慢时间复杂度 O(n*len)海量数据下完全不可用。哈希表查询单个单词速度快但不支持前缀模糊匹配无法实现搜索联想、批量前缀检索且大量重复前缀会造成严重的空间浪费。前缀树的优势查询稳定高效插入、查询、前缀匹配时间复杂度均为 O(字符串长度)和单词总数量无关空间极致优化复用公共前缀字符串越多空间优势越明显天然支持前缀匹配这是哈希表无法替代的核心能力完美适配搜索联想场景。三、前缀树三大核心操作图文流程前缀树所有功能都基于三个基础操作插入、单词查询、前缀匹配。全程逻辑统一简单好记。1. 插入操作构建树结构核心逻辑有则复用无则新建末尾打标记从根节点开始遍历逐个读取单词的每个字符判断当前节点是否存在对应子节点存在则直接跳转子节点不存在则新建子节点所有字符遍历完成后将最后一个节点标记为「单词结尾」。2. 完整单词查询核心逻辑路径完整 末尾是单词结尾从根节点出发逐字符匹配路径中途任意字符缺失直接判定单词不存在路径完全走完后必须判断末尾节点是否为单词结尾关键例树中有 app查询 ap 时路径存在但 ap 不是完整单词返回 false。3. 前缀匹配查询核心逻辑只需路径完整无需判断结尾这是搜索联想的核心只要输入的前缀字符路径能完整匹配就代表存在对应前缀的单词直接返回 true 即可。四、C 实现前缀树#includeiostream#includevector#includestringusingnamespacestd;// 前缀树节点结构structTrieNode{// 26个小写英文字母初始化为空指针TrieNode*children[26]{nullptr};// 标记当前节点是否为单词结尾boolisEndfalse;};classTrie{private:TrieNode*root;// 根节点public:// 构造函数初始化空根节点Trie(){rootnewTrieNode();}// 插入单词voidinsert(string word){TrieNode*noderoot;for(charc:word){intidxc-a;// 字符映射为0-25下标// 节点不存在则新建if(!node-children[idx]){node-children[idx]newTrieNode();}// 移动到子节点nodenode-children[idx];}// 标记单词末尾node-isEndtrue;}// 查找完整单词boolsearch(string word){TrieNode*noderoot;for(charc:word){intidxc-a;// 路径中断单词不存在if(!node-children[idx])returnfalse;nodenode-children[idx];}// 路径走完必须是单词末尾才返回truereturnnode-isEnd;}// 判断是否存在指定前缀boolstartsWith(string prefix){TrieNode*noderoot;for(charc:prefix){intidxc-a;if(!node-children[idx])returnfalse;nodenode-children[idx];}// 仅需路径完整无需判断结尾returntrue;}};// 测试演示intmain(){Trie trie;trie.insert(apple);coutboolalpha;couttrie.search(apple)endl;// truecouttrie.search(app)endl;// falsecouttrie.startsWith(app)endl;// truereturn0;}数组模拟实现前缀树#includeiostream#includestringusingnamespacestd;constintN100010;// 根据题目数据量开大一点inttr[N][26];// 树结构tr[当前节点][字符] 子节点编号boolcnt[N];// 标记是否为单词结尾intidx;// 节点分配器从0开始0是根节点// 初始化前缀树voidinit(){memset(tr,0,sizeof(tr));memset(cnt,0,sizeof(cnt));idx0;}// 插入单词voidinsert(string s){intu0;// 从根节点出发for(charc:s){intpc-a;if(!tr[u][p]){tr[u][p]idx;// 没有则新建节点编号1}utr[u][p];// 走到子节点}cnt[u]true;// 末尾标记为单词}// 查询完整单词boolsearch(string s){intu0;for(charc:s){intpc-a;if(!tr[u][p])returnfalse;utr[u][p];}returncnt[u];// 必须是单词结尾}// 查询是否存在前缀boolstartsWith(string s){intu0;for(charc:s){intpc-a;if(!tr[u][p])returnfalse;utr[u][p];}returntrue;// 路径走完即存在前缀}intmain(){init();insert(apple);coutsearch(apple)endl;// 1coutsearch(app)endl;// 0coutstartsWith(app)endl;// 1return0;}五、前缀树真实落地场景前缀树不是纸上谈兵的算法结构在工程开发中应用极广几乎所有字符串前缀相关的优化场景都能看到它的身影搜索框/输入法联想补全输入部分前缀快速匹配所有关联词条敏感词过滤系统将所有敏感词构建前缀树遍历文本即可快速匹配违规词汇效率远超暴力匹配拼写检查工具快速校验单词是否合法路由最长前缀匹配网络路由器通过前缀树精准匹配最优路由地址字符串统计统计指定前缀的单词数量、高频词筛选。六、前缀树优缺点总结✅ 优点前缀匹配、字符串查询效率极高不受数据总量影响大量相似字符串场景下空间利用率远超哈希表、数组逻辑清晰代码实现简单工程落地性强。❌ 缺点短字符串、无公共前缀的字符串场景空间开销大于哈希表仅擅长前缀匹配不支持后缀、子串匹配可拓展AC自动机解决。七、学习总结前缀树的核心精髓可以浓缩为一句话用空间换时间用前缀共享降本增效。它没有复杂的旋转、平衡逻辑是最友好的树结构之一。掌握插入、查询、前缀匹配三大基础操作就足以应对 90% 的面试算法题和工程开发场景。后续进阶可以学习基于前缀树优化的 AC 自动机解决多模式字符串匹配、批量敏感词过滤等复杂问题。
http://www.zskr.cn/news/1407754.html

相关文章:

  • 网易云音乐无损下载工具:三步获取专业级音质音乐
  • 嵌入式 - 数据结构与算法:(1-14)排序算法 - 冒泡/选择/快速/希尔排序对比
  • 动态群组认证:双向验证与哈希链如何抵御物联网恶意节点
  • 5分钟搭建微信群消息自动转发系统:告别手动复制的烦恼
  • TrafficMonitor插件完全指南:3步打造你的个性化系统监控信息中心
  • List<T> 投影转换(Select)作用 + 详解 + 示例
  • 基于深度学习的吸烟、喝水和打电话行为检测系统(YOLOv8+YOLO数据集+UI界面+Python项目+模型)
  • 核心图纸外发易泄露?文件安全外发管控产品推荐,合规可追溯
  • 基于调制运动模糊的车辆速度估计:WDPMVA算法与MOIM硬件设计
  • 不只是供电:深入拆解STM32项目中DCDC电源电路的7个设计细节与选型思考
  • 手把手教你用LoRa-Kit开发板+安信可小程序,5分钟搞定LoRa点对点通信测试
  • Redis五大基础数据类型命令详解与经典应用场景
  • Adobe Illustrator终极自动化工具集:25个免费脚本让设计效率飙升300%
  • AI+算法混合架构:10秒批量生成个性化宾果卡的技术实践
  • Unity小地图实战:从零到一,手把手教你打造一个可缩放、可展开的2D/3D游戏Minimap(含完整源码)
  • 为什么你的提问总被帮助中心“忽略”?揭秘ChatGPT知识库匹配逻辑与4步精准提问公式
  • 2026年 钢结构厂家/工程公司推荐榜单:辽宁/吉林钢结构施工,车间与建筑项目实力优选! - 品牌企业推荐师(官方)
  • GraphRAG【部署 01】Linux环境安装部署GraphRAG并使用Ollama本地大模型
  • 从FLV到HTML5:flv.js如何突破浏览器限制实现高效直播播放
  • 如何永久备份微信聊天记录?WeChatMsg完整数据留存方案指南
  • 个人工作室可以开通GEO优化吗
  • 拒绝浓重机器味!2026毕业论文降AI实操:打破模型底层逻辑
  • Agent 面试,项目是 20 分,讲项目是 80 分
  • GEO自然优化和付费推广区别
  • 2026西安财税咨询机构深度测评:3家主流财税对比! - 小柏云
  • 163MusicLyrics:3分钟掌握网易云和QQ音乐LRC歌词获取技巧
  • 第3讲 【大模型基础1】AI、机器学习、深度学习与大模型的关系
  • 目前口碑好的家政保洁品牌推荐
  • 别再用老掉牙的猫狗数据集了!用TensorFlow 2.1+Python 3.6,从数据清洗到模型调优的完整避坑指南
  • 2026年 大连电脑维修推荐榜:沙河口笔记本/台式机/服务器/戴尔联想惠普等品牌维修,专业高效口碑之选 - 品牌企业推荐师(官方)