Trie树 字典树-学习笔记
字符串——蒟蒻永远的阴影
对于字符串匹配
KMP很好的解决了以一个文本串匹配一个模板串的问题
但如果模板串有多个呢
这是KMP不再适用
我们引入一个新的数据结构——字典树
(当然又有像AC自动机这样更优的)
(但要理解AC自动机,便必须先学会KMP与字典树的思想)
字典树可以将多个单词压缩到一棵树上
这样便减少了对于一个文本串要匹配多个模板串时
要重复匹配相同前缀的弊端
先呈上一张字典树的图解
如图所示
字典树的每条边储存了一个字符
这样从根结点走下来
每个结点便代表一个单词
但特别的,根节点是不表示字符或单词的!!!
然而我们要怎样确定那些结点代表的单词在模板串里出现过呢
所以这里我们给那些代表的单词在模板串里出现过的结点
再插入时就打上一个标记
如图中黄色结点
这里也讲一下字典树的缺点
由于树的每层都要对应有26个字母
那么如果模板串很长
空间开销就会特别大
如果不止小写字母
那么空间开销还会更大
不过一般的题目也不会卡那么紧
下面是字典树的基本操作
字典树结构体
struct node
{
node* nxt[26];//对应下一层字母的指针
bool judge;//判断该单词模板串里出现过
node()//构造函数;初始化
{
judge=false;
for(int i=0;i<26;i++)
nxt[i]=NULL;
}
};
node* rt=new node();//初始根结点
插入
void ins(char ss[])
{
int len=strlen(ss);
node* p=rt;
for(int i=0;i<len;i++)
{
int num=ss[i]-'a';//找到下一层结点
if(p->nxt[num]==NULL)
{
node* k=new node();
p->nxt[num]=k;
}//如果该节点不存在则创建新结点,否则继续迭代插入
p=p->nxt[num];
}
p->judge=true;//单词插入完毕,标记该节点
}
查找/匹配
bool find(char ss[])
{
int len=strlen(ss);
node* p=rt;
for(int i=0;i<len;i++)
{
int num=ss[i]-'a';
p=p->nxt[num];
if(p==NULL) return false;
//如查找过程中有结点不存在,则匹配失败
}
if(p->judge)return true;
//遍历完文本串,若该接点被标记,则查着成功
else return false;//否则查找失败
}
其实插入和查找的代码挺像的不是嘛
Trie树 字典树-学习笔记的更多相关文章
- 剑指Offer——Trie树(字典树)
剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位 ...
- AC自动机——1 Trie树(字典树)介绍
AC自动机——1 Trie树(字典树)介绍 2013年10月15日 23:56:45 阅读数:2375 之前,我们介绍了Kmp算法,其实,他就是一种单模式匹配.当要检查一篇文章中是否有某些敏感词,这其 ...
- 珂朵莉树(Chtholly Tree)学习笔记
珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...
- Trie(字典树)
没时间整理了,老吕又讲课了@ @ 概念 Trie即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种,典型应用是统计和排序大量的字符串(不限于字符串) Trie字典树主要用于存储字符串, ...
- 9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第9章 查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚 ...
- Trie树(字典树)的介绍及Java实现
简介 Trie树,又称为前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀,也 ...
- Trie(前缀树/字典树)及其应用
Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...
- [LintCode] Implement Trie 实现字典树
Implement a trie with insert, search, and startsWith methods. Have you met this question in a real i ...
- Trie树|字典树(字符串排序)
有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n). Trie树又名字典树,从字面意思即可理解,这种树的结构像英 ...
随机推荐
- 【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作
1.新建学生表 这节课我们来把和数据库以及jdbc相关的内容完成,首先,进行数据库建表.数据库呢,我们采用MySQL数据库,我们可以通过navcat之类的管理工具来轻松建表. 首先,我们得建一个数据库 ...
- CCF系列之画图(201409-2)
试题编号: 201409-2试题名称: 画图时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从 ...
- Mybatis问题:There is no getter for property named 'unitId' in 'class java.lang.String'
Mybatis遇到的问题 问题: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.re ...
- python与MySQL
一.python与mysql交互 因版本不同python操作mysql有两个模块,python3不再支持MySQL-python,模块使用都一样: python2.7:MySQL-python pyt ...
- phpstorm修改创建文件时的默认注释
之前也修改过,过了一段时间又忘了,记个笔记.下次好找 工具版本 工具设置里,File>>Settings...如下
- Android之MaterialDesign应用技术2-仿支付宝上滑搜索框缓慢消失
PS:在这之前也就是上一篇介绍了MaterialDesign一些滑动删除.标题栏的悬浮效果等,如果没看过第一篇的小火鸡可以看一下,因为这篇是接着上一篇写的,有一些东西上一篇写过了这里就不在重复了(Ma ...
- maven系列--maven常用命令
下一篇博客我会讲解用eclipse的m2插件来使用maven,这里先大概的了解下maven常用的命令.之后我在详细整理maven的生命周期,到时候会细致的讲解下这些指令应该要怎么使,maven都帮我们 ...
- RChain总体架构图
RChain是我研究区块链依赖发现的和我最契合的(主要是用scala写的),在架构上吞吐率和扩展性也是最好,未来是真正有可能实现在它官网上宣称的能够承载facebook一样的规模,具有和visa一样的 ...
- ado.net 参数传递之 in
之前项目有一放行的功能,对某界面维护时(数据的增删改),先将数据保存到临时表中,放行后再真正的写入到库中.由于设计到主从表多中约束关系,所以当时我采用的是写一个存储过程来对某个界面的操作进行统一处理, ...
- 2. getline()和get()
1.面向行输入:getline() ---其实还可以接受第三个参数. getline()函数读取整行,调用该方法 使用cin.getline().该函数有两个参数, 第一个参数是是用来存储输入行的数组 ...