此处大佬文章引路:

字典树(Trie)详解 - Seaway-Fu - 博客园 (cnblogs.com)

Trie树(Prefix Tree)介绍_神奕的专栏-CSDN博客_prefix tree

目录

0.初遇字典树

1.用处:

2.性质:

3.作用扩展:

4.优缺点:

5.代码实现(建树、查询):


0.初遇字典树

Trie树,又叫字典树前缀树(Prefix Tree)单词查找树 或 键树,是一种多叉树结构。(空间换时间:开的空间大,但查询效率快)

可以发现,这棵字典树用边来代表字母,而从根结点到树上某一结点的路径就代表了一个字符串。举个例子,1→4→8→12 表示的就是字符串 caa。(图片摘自OI Wiki)

宽度:范围(例:小写英文字母->26)

深度:最长的字母长度加1(root根节点独占顶层)

1.用处:

维护字符串,存储 字典 的一种数据结构。

2.性质:

(1)根节点不包含字符,除根节点外的每一个子节点都包含一个字符。

(2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。

(3)每个节点的所有子节点包含的字符互不相同。

注:

<1>在建树的时候,每个结点放个标记,看它能不能构成单词。

<2>两个有公共前缀的关键字,在Trie树中前缀部分路径相同,所以又叫前缀树。

3.作用扩展:

(1)字符串检索:

检索/查询功能是Trie树最原始的功能。思路就是从根节点开始一个一个字符进行比较。

<1>如果沿路比较,发现不同的字符,则表示该字符串在集合中不存在。

<2>如果所有的字符全部比较完并且全部相同,还需判断最后一个节点的标志位(标记该节点是否代表一个关键字)。

struct trie_node

{

bool trie_flag;   // 标记该节点是否代表一个关键字/单词

trie_node_next [26]; // 各个子节点

};

(2) 词频统计:Trie树常被搜索引擎系统用于文本词频统计。

struct trie_node

{

int words_count;   // 记录该节点代表的单词的个数

trie_node_next [26]; // 各个子节点

};

思路:为了实现词频统计,我们修改了节点结构,用一个整型变量count来计数。对每一个关键字执行插入操作,若已存在,计数加1,若不存在,插入后count置1。

(3) 字符串排序:

思路:遍历一次所有关键字,将它们全部插入trie树,树的每个结点的所有儿子很显然地按照字母表排序,然后先序遍历输出Trie树中所有关键字即可。

(4)前缀匹配:

例如:找出一个字符串集合中所有以ab开头的字符串。我们只需要用所有字符串构造一个trie树,然后输出以a->b->开头的路径上的关键字即可。

trie树前缀匹配常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。

(5)如后缀树,AC自动机等。

4.优缺点:

优点:插入、查询O(n) (n:点的个数) 的复杂度,不用求hash值,字典序排序。

缺点:hash函数很好时,trie树的查找效率比不过哈希搜索,空间消耗比较大。

5.代码实现(建树、查询):

代码如下(改自OI Wiki):

struct trie {int next[100000][26], cnt; //前一维表示存的结点,后一维表示宽度,如果想添加其它功能,可以把int型改为结构体类型bool exist[100000];  //判断此结点能否构成单词void insert(char *s, int l) {  // 插入字符串s,l为字符串s的长度int p = 0;for (int i = 0; i < l; i++) {int c = s[i] - 'a';    //这里是把char型换成int型0~25储存起来if (!next[p][c]) next[p][c] = ++cnt;  // 如果没有,就添加结点p = next[p][c];}exist[p] = 1;}bool find(char *s, int l) {  // 查找字符串  //可根据具体情况返回bool/int型int p = 0;for (int i = 0; i < l; i++) {int c = s[i] - 'a';if (!next[p][c]) return 0;p = next[p][c];}return exist[p];}};

板子题:P2580 于是他错误的点名开始了 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:此例题就需要根据find返回的int型判断点到的次数,将exist数组类型改为int型

注:next数组前一维是所有字符串中字母的总个数,如字符串长度100以内,个数1e5,那nxet[N][26]中的前一维需要开到1e6~1e7(有前缀重叠情况),即 N的大小<=字符串长度*字符串个数

AC代码如下:

/*
trie树 板子题 洛谷P2580 于是他错误的点名开始了
https://www.luogu.com.cn/problem/P2580
*/
#include<bits/stdc++.h>using namespace std;typedef long long ll;
const int N=1e6+10;int n,m;
char s[100];struct trie{int next[N][26],cnt=0;   //前一维存的结点,后一位宽度int exist[N];      //判断此结点能否构成单词void insert(char *s){int p=0;//printf("strlen(s)=%d\n",strlen(s));for(int i=0;i<strlen(s);i++){int c=s[i]-'a';if(!next[p][c]){next[p][c]=++cnt;}p=next[p][c];}exist[p]=1;}int find(char *s){int p=0;for(int i=0;i<strlen(s);i++){int c=s[i]-'a';if(!next[p][c]){return 0;}p=next[p][c];}if(exist[p]==1){exist[p]=2;return 1;}elsereturn 2;}
}trie_tree;int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf(" %s",s);trie_tree.insert(s);}scanf("%d",&m);for(int i=1;i<=m;i++){scanf(" %s",s);if(trie_tree.find(s)==1){printf("OK\n");}else if(trie_tree.find(s)==2){printf("REPEAT\n");}else{printf("WRONG\n");}}return 0;
}

Trie树(字典树、前缀树) (小白整理)相关推荐

  1. 前缀树是什么 前缀树的使用场景

    前缀树的概述 前缀树又名字典树,单词查找树,Trie树,是一种多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构. 典型应用是用于统计和排序大量的字符串(但不仅限于字符 ...

  2. 字典数(前缀树)的实现

    [题目] 字典树又称为前缀树或者Trie树,是处理字符串常用的数据结构.假设组成所有单词的字符仅是'a'-'z',请实现字典树的结构,并包含以下四个主要的功能. void insert(String ...

  3. trie树模板(前缀树)

    //查询字符串是否出现过 #include "bits/stdc++.h" using namespace std; const int N = 100005; int n,m; ...

  4. 字典树(Trie,前缀树)

    目录 一,字典树 二,OJ实战 CSU 1115 最短的名字 HDU 1075 What Are You Talking About 力扣 1804. 实现 Trie (前缀树) II 力扣 139. ...

  5. 字典树(Trie/前缀树)

    目录 字典树的概念 字典树的逻辑 字典树的实现 易混点剖析 代码示例 字典树的概念 字典树(Trie)是一种空间换时间的数据结构,是一棵关于"字典"的树.主要用于统计.排序和保存大 ...

  6. 【数据结构】前缀树/字典树

    目录 1.概述 2.代码实现 3.应用 本文参考: LeetCode 208.实现 Trie (前缀树) 1.概述 前缀树又称字典树.Trie 树.单词查找树,是一棵有根树,同时也是一种哈希树的变种, ...

  7. Trie(前缀树,prefix tree)

    trie或者prefix tree(前缀树),是一种有序树数据结构,它通常被存储在一个以字符串为关键字的联合数组中.于二叉搜索树不同,在树里没有结点存储与结点相关联的关键字.它是用它在树中的位置展示与 ...

  8. Leetcode 208、实现Trie(前缀树)

    Leetcode 208.实现Trie(前缀树) 使用数组实现前缀树 insert() 向前缀树里面插入字符串 遍历当前要插入的字符串,查看当前数组对应的位置是否为空 如果为空,temp[curr] ...

  9. 前缀树TrieNode

    前缀树又叫单词查找树/字典树,Tire树,是哈希树的变种.典型应用于统计,排序和保存大量字符串,经常被搜索引擎系统用于文本词频统计. 前缀树的每一个节点会有多个子节点,通往不同子节点的路径上有着不同的 ...

  10. 前缀树 - Java 实现

    前缀树 - Java 实现 1. 简介 2. 实现 1. 简介 字典树,又称前缀树.前缀树的3个基本性质: 根节点不包含字符,除根节点外每一个节点都只包含一个字符. 从根节点到某一节点,路径上经过的字 ...

最新文章

  1. 全球最大的3D数据集公开了!标记好的10800张全景图
  2. 深度学习将眼睛变成健康“指示器”
  3. JAVA期末简答题参考
  4. 力压 Java 与 C 的 Python 现状如何了?
  5. oracle数据库存储函数,Oracle数据库存储过程
  6. 2019牛客多校第四场 B xor (线性基求交)
  7. 是否要从单片机转嵌入式Linux?
  8. matlab幻方变换_幻方变换加密数字全息图
  9. 恶意代码防范技术原理-计算机病毒和特洛伊木马分析与防护
  10. 计算机基础知识教程表格日期,EXCEL设置自动生成特殊日期
  11. 计算机视觉注意力网络(一)——简介
  12. 将test1文件下的.java文件复制到copy文件下
  13. 搭建文华财经博易大师信管家多国语言IQ Option二元期权源码
  14. JDK下载(jdk1.8下载与安装教程)
  15. el-admin框架简单解析-快速入门(前端部分)
  16. 模拟电路----电压跟随器与功率放大器(转)
  17. HarmonyOS - 华为智慧屏网络卡顿、跳帧解决方案
  18. List元素去重的六种方式
  19. 第一届BMZCTF公开赛-MISC-Writeup
  20. 镁客网每周硬科技领域投融资汇总(2.2-2.10),自动驾驶“明星创企”Aurora获得新融资...

热门文章

  1. JSAPI 高德地图应用--关键字搜索、POI搜索定位,获取经纬度
  2. 网络适配器、网卡和网卡驱动
  3. html怎么做左侧广告,网站横幅怎么制作,html横幅广告代码
  4. java 主动模式 port_详解SpringBoot修改启动端口server.port的四种方式
  5. Normalize.css 支持 HTML5 的CSS Reset
  6. W806开发板环境搭建
  7. 移动跨平台框架ReactNative文本组件Text【06】
  8. 网银--U盾等--支付宝等总结
  9. ElementUI 面试题整理
  10. 高薪的软件测试工程师要掌握哪些专业技能?