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

Trie字典树

字典树介绍

字典树(Trie,前缀树单词查找树)是一种多叉树形数据结构,专门用于高效存储和检索字符串(或有序序列) 的前缀、完整序列。其核心设计思想是利用数据的公共前缀共享存储路径,从而减少空间浪费,并将插入、查询的时间复杂度降低到与序列长度相关的水平(O(L),L为序列长度),在字符串处理场景中具有不可替代的优势。

核心思想

在处理大量字符串时,若直接存储每个字符串,会存在大量重复前缀的冗余(比如appleappapply都共享app前缀)。字典树通过让拥有相同前缀的字符串共享同一部分路径,将冗余的前缀合并,从而实现空间和时间的优化。

比如插入字符串单"abc",“abb”,“bca”,"bc"。红点代表有一个以此节点为终点的单词。

image

然后,我们如果要查找某个单词如s=“abc”,就可以这样

image

构建字典树

int id = 0;             // 节点计数器:为新建节点分配唯一编号(根节点固定为0)
int cnt[N];             // cnt[p]:以节点p对应的前缀的模式串数量(核心统计值)
unordered_map<int, int> node[N];  // 每个节点的子节点映射:// node[p]是哈希表,键=字符转换后的索引,值=子节点编号

插入模式串以构建字典树

void insert(string s){int p = 0;  // 从根节点(编号0)开始遍历for(int i = 0; i < s.size(); ++i){  // 遍历字符串的每个字符int t = change(s[i]);  // 字符转索引if(node[p][t] == 0){  // 若当前节点p的t字符对应的子节点不存在id++;  // 新建节点,编号自增node[p][t] = id;  // 记录子节点编号}p = node[p][t];  // 移动到子节点cnt[p]++;  // 该前缀的模式串数量+1}
}

在字典树上查找文本串

int find(string s){int p = 0;  // 从根节点开始遍历for(int i = 0; i < s.size(); ++i){  // 遍历查询字符串的每个字符int t = change(s[i]);  // 字符转索引if(node[p].count(t) == 0) return 0;  // 子节点不存在,返回0p = node[p][t];  // 移动到子节点}return cnt[p];  // 返回该前缀的模式串数量
}

 

例题:【模板】Trie 字典树_牛客题霸_牛客网

 代码通过change函数实现了大小写字母均支持的字典树

const int N = 1e5 + 5;
int id = 0;
int cnt[N];
unordered_map<int, int> node[N];int change(char c){if(c >= 'a' && c <= 'z') return c - 'a';if(c >= 'A' && c <= 'Z') return 26 + c - 'A';return -1;
}void insert(string s){int p = 0;for(int i = 0; i < s.size(); ++i){int t = change(s[i]);if(node[p][t] == 0){id++;node[p][t] = id;}p = node[p][t];cnt[p]++;}
}int find(string s){int p = 0;for(int i = 0; i < s.size(); ++i){int t = change(s[i]);if(node[p].count(t) == 0) return 0;p = node[p][t];}return cnt[p];
}void solve(){int n, q;string s, t;cin >> n >> q;for(int i = 0; i < n; ++i){cin >> s;insert(s);}while(q--){cin >> t;cout << find(t) << endl;}
}

 

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

相关文章:

  • 从下载到激活:Multisim14.3教学环境安装全记录
  • LangFlow知识图谱构建辅助流程设计
  • 我发现了人人都在吹的 CSS 神技——然后我的写法彻底变了
  • 从单点充电到全域智控:安科瑞重塑新能源充电生态
  • 图解说明Altium Designer高速信号回流路径设计
  • 2025年中国电缆一线品牌推荐:中国电缆知名品牌盘点,缆标杆品牌推荐(12月更新) - 品牌2026
  • 户外LED显示屏安装前期风载与防水考量深度解析
  • rust自动调用Deref(deepseek)
  • 告别传统照明痛点,安科瑞智能系统开启智慧控光新时代
  • 全自研仿真GPU求解器x虚实对标物理测量工厂,打造具身合成数据SuperApp,加速具身仿真生态丨光轮智能@MEET2026
  • SmartLayout智能窗口布局工具:重新定义你的多任务工作空间
  • LangFlow语音助手前后端联动设计方案
  • LangFlow SQL生成助手构建过程全记录
  • 如果早点知道这 7 个 Mac 神器,我的早晨至少能少崩溃一半
  • 中国电缆一线品牌推荐2025年TOP榜单:矿山煤矿、变频、光伏、绝缘、工程项目电缆标杆品牌盘点(12月新版) - 品牌2026
  • 基于Keil的STM32实时变量监控:图解说明方法
  • 串口数据缓存管理策略:qserialport高级应用指南
  • STM32CubeMX无法打开:新手教程之Windows权限设置
  • Altium高速布局技巧:减少串扰的实用方法
  • .NET+AI | Agent | Agent as Function (14)
  • 如何在 Python 中对面板数据进行交叉验证
  • 达梦数据库备份还原
  • elasticsearch官网在日志分析中的核心要点解析
  • LangFlow法律文书辅助撰写系统设计思路
  • 如何创建自定义 Matplotlib 主题,并让您的图表从无聊变得精彩
  • Packet Tracer官网下载后的更新与升级方法
  • 抖音下载工具无水印终极指南:实用技巧与高效方法
  • LangFlow JSON解析器节点应用实例:提取结构化结果
  • 智能机器狗项目开发中的问题记录
  • 新手教程:手把手教你掌握DRC基本概念与使用场景