字典树

先上个定义。

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

字典树有两种构建方式,一种是指针构建,一种是数组构建。思路答题一样不过自我感觉指针好理解,数组好写好构建。可以先看指针是怎么做的再来看数组会有不一样的感觉。都这样说了就先上指针的做法。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{int cnt;//判断是否为单词struct tree *next[26];
}tree;int top;
struct tree a[2000000];//记得申请静态tree *createtree()//初始化树
{int i;tree *treeNode = &a[top++];for(i = 0; i < 26; i++)treeNode->next[i] = NULL; //节点的next全指向为NULLtreeNode -> cnt = 0;return treeNode;
}int Inserttree(tree *ptrRoot, char *str)
{int i, index;tree *tempNode = ptrRoot;//用以操作树的节点的指针for( i = 0 ;i < strlen(str); i++){index = str[i] - 'a';if(tempNode->next[index]!=NULL)//也从树的头处开始询问当前字母是否存在{tempNode = tempNode->next[index]; //存在,进入该字母所在的节点continue;}tempNode->next[index] = createtree();//不存在,先建立这样一个节点tempNode = tempNode->next[index];}tempNode->cnt++;//这里循环完成到达单词结尾,标记为单词return 0;
}int SearchTrieTree(tree *ptrRoot, char *str)
{int i, index;tree *tempNode = ptrRoot;for(i = 0 ;i < strlen(str); i++)//遍历前缀{index = str[i] - 'a';if(tempNode->next[index]!=NULL)//也从树的头处开始询问当前字母是否存在{tempNode  = tempNode->next[index];//存在进入下一指针}else{return 0;//不存在直接返回}}if(tempNode->cnt)//!!!这就是为什么要标记单词结尾因为可能出现前缀比较相同但只事子串的可能性,比如:absd上找ab前缀相同但并没有ab这个单词。{return tempNode->cnt;}else{return 0;}
}int main()
{int n,m;char s[15];while(~scanf("%d %d", &n, &m)&&n&&m){top = 0;tree *tree = createtree();getchar();while(n--){gets(s);Inserttree(tree, s);}while(m--){gets(s);int res = SearchTrieTree(tree, s);if(res == 1)printf("Yes\n");elseprintf("No\n");}}
}

接下来是数组构造,好写但第一次看真的不好理解。可以手写一下感受一波。说明下参数 p表示当前节点的地址,j表示字母的通道,数值就是通到链接下个头节点的地址了 关键就是这句话。

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define N 2100000//一定要开大!!!
int str[N][26];//看成N个连续的地址空间 每个空间有26个通道和一个计数
int num;//模拟连续内存的首地址,是几无所谓啦,默认0
int mark[N];void Insert(char *s)
{int i, len = strlen(s);int p = 0; //类似指针,数值就是地址了for(i = 0; i < len; i++){int t = s[i] - 'a';if(!str[p][t]) str[p][t] = ++num;//0地址的空间作为root了,判断当前字母是否存在。不存在,选取下一个空的空间连通,作为该字母的节点p = str[p][t];//进入当前字母链接的节点}mark[p]++;//老样子标记单词结尾
}int find(char *s)//比较和链式的没区别不多BB了
{int len = strlen(s);int p = 0, i;for(i = 0; i < len; i++){int t = s[i] - 'a';if(!str[p][t]) return 0;p = str[p][t];}return mark[p];
}int main()
{int n, m, i, j;char a[55];while(~scanf("%d%d", &n, &m)){if(!n && !m)return 0;else{memset(str, 0, sizeof(str));//记得初始化!memset(a, '\0', sizeof(a));//记得初始化!!memset(make, 0, sizeof(make));//记得初始化!!!num = 0;while(n--){getchar();scanf("%s", a);Insert(a);}while(m--){getchar();scanf("%s", a);if(find(a))printf("Yes\n");elseprintf("No\n");}}}return 0;
}

参考博客:字典树(链式+数组模拟)–最基础的算法,最详细的注释,写的真的很好。

【字典树】2828 - 字典树相关推荐

  1. 字典树01字典树专题对字典树的理解

    对于字典树和01字典树的一点理解: 首先,字典树建树的过程就是按照每个数的前缀来的,如果你要存储一个全小写字母字符串,那么这个树每一个节点最多26个节点,这样的话,如果要找特定的单词的话,按照建树的方 ...

  2. 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机

    目录 用TrieTrieTrie树来处理整数异或问题是真的舒服! 一.TrieTrieTrie树 TrieTrieTrie的基本操作 0.初始化 1.插入 2.检索 二.TrieTrieTrie树例题 ...

  3. 字典树(trie树)、后缀树

    (1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...

  4. 字典树-01字典树基础

    字典树-01字典树 什么是字典树? 字典树,又叫前缀树,Trie树,通常被用作字符串匹配. 它的实现原理是什么? 先建立一颗树,对于这棵树上每个节点i与其后继节点间的连线,都有存入一个字符. 对于存图 ...

  5. 字典树(Trie树)的原理与实现

    一.概述 1.1 基本概念 字典树,又称为单词查找树,Tire数,是一种树形结构,它是一种哈希树的变种. 1.2 基本性质 根节点不包含字符,除根节点外的每一个子节点都包含一个字符 从根节点到某一节点 ...

  6. Trie树(字典树)详细知识点及其应用

    Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...

  7. 前缀树(字典树,单词查找树,Trie树)

    参考网址:https://blog.csdn.net/u013949069/article/details/78056102?utm_source=copy 概述 前缀树又名字典树,单词查找树,Tri ...

  8. 【字典树】字典树的创建(入门详细介绍)

    Part one[何谓字典树] 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. ...

  9. 分门别类刷leetcode——高级数据结构(字典树,前缀树,trie树,并查集,线段树)

    目录 Trie树(字典树.前缀树)的基础知识 字典树的节点表示 字典树构造的例子 字典树的前序遍历 获取字典树中全部单词 字典树的整体功能 字典树的插入操作 字典树的搜索操作 字典树的前缀查询 字典树 ...

最新文章

  1. 卸载破解的Navicat!操作所有的数据库靠它就够了!
  2. 在直播问题上,智能电视们不应该沉默
  3. android自定义图标下载,charts
  4. 回文数、括号匹配(栈操作)
  5. [Leetcode][第546题][JAVA][移除盒子][递归][动态规划]
  6. r读取shape文件可视化_使用Python对大脑成像数据进行可视化分析
  7. 盘点前端HTML基础知识
  8. flightgear通过UDP协议输出飞行态势数据以及利用C++接收flightgear数据
  9. 一个工业相机通用类解决大部分业内流行相机的访问(基于大华相机的动态链接库开发的通用相机类)C#版
  10. Google产品设计师:从二维界面到虚拟现实
  11. 应届生面试这样准备,最能展现自己优势!
  12. 后台进程很少,CPU内存却占用过高!
  13. 02 stata入门【计量经济学及stata应用】
  14. Win8.1 安装nltk及nltk_data数据
  15. poscms会员等级星星
  16. 双亲委派模型和破坏性双亲委派模型详解
  17. 计算机镜像怎么恢复,利用系统映像还原Windows7系统的方法
  18. 初学SNMP,在spring boot 下使用snmp4j 做本地测试调通的记录
  19. window7激活攻略
  20. alter table add constraint 用法

热门文章

  1. 条码标签设计软件Nicelabel使用方法
  2. 华为的鸿蒙系统是海思_华为鸿蒙系统能成为超算系统吗?华为硬件可以组成生态圈,可行!...
  3. 跟我一起写makefile
  4. 新玺配资:市场洗盘调整 注意捕捉短线机会
  5. 《nodejs实战》读书笔记
  6. 人类的征途是星辰大海,玉兔的征途从月球开始
  7. 函数式编程中的副作用概念
  8. 视频教程-wordpress建站教程之环境部署详解课程-PHP
  9. 番外篇(1)模块次序表、代数环及其检测算法
  10. CMT2380/HC32L110入门踩坑记录