关于Trie的一些算法
最近学习了一下关于Trie的一些姿势,感觉很实用。
终于不用每次看到字符串判重等操作就只想到hash了
关于Trie的定义,来自百度百科
在计算机科学中,Trie,又称前缀树或字典树,是一种有序树状的数据结构,用于保存关联数组,其中的键通常是字符串。
说的有点高级,我们不要管它,可以看这样一张图:
这棵Trie中的单词共有:his,he,her,me,your
就是从根节点一直到某个有end(结尾)标记的点
可以发现,Tire其实就是把一些字符串的公用前缀字符存储了下来
Tire的实现更是简单:
建立一棵Trie,初始时只有一个空的根节点(编号为0)
每当插入或删除时,如果当前字符在之前的操作中已经建立,然后直接利用即可,否则新建立一个节点并让上一个节点连上它
当一个字符串结束时,给该节点做个记号,同时也可存储些其它的信息
具体的实现方法也有两种:邻接表和邻接矩阵
在Trie中,显然用邻接矩阵是很快的,但空间的开销可能较大,如果题目说明范围,那么空间允许的情况下可以使用
邻接表还是一样,比较省空间(毕竟要多少开多少)
这里用一道板子题来理解一下:
hihocoder 1366 : 逆序单词
邻接矩阵CODE
#include<iostream>
#include<string>
using namespace std;
const int N=50005;
struct node
{bool end;int next[30];
}trie[N<<4];
string s;
int n,ans,cnt;
inline bool find(string s)
{int now=0,len=s.size();for (register int i=0;i<len;++i){if (trie[now].next[s[i]-'a'+1]) now=trie[now].next[s[i]-'a'+1]; else return 0;if (i==len-1) return trie[now].end;}
}
inline void insert(string s)
{int now=0,len=s.size();for (register int i=0;i<len;++i){if (trie[now].next[s[i]-'a'+1]) now=trie[now].next[s[i]-'a'+1]; else trie[now].next[s[i]-'a'+1]=++cnt,now=cnt;if (i==len-1) trie[now].end=1;}
}
int main()
{register int i;for (cin>>n,i=1;i<=n;++i){cin>>s;string rs(s.rbegin(),s.rend());if (find(rs)) ++ans;insert(s);}cout<<ans;return 0;
}
邻接表CODE
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int N=50005;
struct node
{bool end;char ch;
}trie[N<<4];
struct edge
{int to,next;
}link[N<<4];
string s;
int head[N<<4],n,ans,cnt;
inline void add(int x,int y,char z)
{link[y].to=y; trie[y].ch=z; link[y].next=head[x]; head[x]=y;
}
inline bool find(string s)
{int now=0,len=s.size();for (register int i=0;i<len;++i){bool flag=0;for (register int j=head[now];j!=-1;j=link[j].next)if (trie[link[j].to].ch==s[i]) { flag=1; now=link[j].to; break; }if (!flag) return 0;if (i==len-1) return trie[now].end;}
}
inline void insert(string s)
{int now=0,len=s.size();for (register int i=0;i<len;++i){bool flag=0;for (register int j=head[now];j!=-1;j=link[j].next)if (trie[link[j].to].ch==s[i]) { flag=1; now=link[j].to; break; }if (!flag) add(now,++cnt,s[i]),now=cnt;if (i==len-1) trie[now].end=1;}
}
int main()
{register int i;memset(link,-1,sizeof(link));memset(head,-1,sizeof(head));for (cin>>n,i=1;i<=n;++i){cin>>s;string rs(s.rbegin(),s.rend());if (find(rs)) ++ans;insert(s);}cout<<ans;return 0;
}
转载于:https://www.cnblogs.com/cjjsb/p/8835042.html
关于Trie的一些算法相关推荐
- 提高篇 第二部分 字符串算法 第3章 Trie字典树
Trie(字典树)解析及其在编程竞赛中的典型应用举例 - Reqaw - 博客园 『一本通』Trie字典树 - YeLingqi - 博客园 字典树(Trie Tree) - 仰望高端玩家的小清新 - ...
- vue表情包渲染,trie算法实现,表情包资源分享
表情包图片资源 https://yuan-1252477692.cos.ap-guangzhou.myqcloud.com/blog/files/emoticon.zip data.json {&qu ...
- 数据结构与算法学习-开篇
前言 数据结构和算法这门课一直是计算机专业最基础的一门课,大学时期掌握的不够好,毕业后长期写业务,也没有特别的花时间好好攻克一下,一直是自己的短板.这次在极客时间上订阅了两门数据结构和算法方面的专栏, ...
- 字典树(trie树)、后缀树
(1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...
- 数据结构与算法总结(完结)
极客时间算法学习之后开始跟着花花酱刷题.大概从4月份开始的.从今天开始(2020-8-24)开始做总结,复习一下已经刷过的题目.到目前为止leetcode刷题323道. 2020/8/24 完成题目整 ...
- 双数组trie树的基本构造及简单优化
一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...
- 前缀树(字典树,单词查找树,Trie树)
参考网址:https://blog.csdn.net/u013949069/article/details/78056102?utm_source=copy 概述 前缀树又名字典树,单词查找树,Tri ...
- 汉语词典快速查询算法研究
原贴:http://www.nlp.org.cn/docs/docredirect.php?doc_id=1118 汉语词典快速查询算法研究 李江波 周强 陈祖舜 (清华大学智能技术与系统国家重点实验 ...
- Trie 前缀树的c 实现
Trie树,又称为字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树数据结构. 用于保存大量的字符串.它的优点是:利用字符串的公共前缀来节约存储空间. Trie的核心思想是空间换时 ...
最新文章
- MarkdownPad2 免费升级pro版本
- C# 子窗口修改主窗口的控件
- Shape Drawable Xml的background
- 24、Power Query-数学运算的应用(统计男女人数)
- html5做旋转太极图,HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)...
- for循环的break和continue
- HDU 5882 Balanced Game 分析+欧拉图
- NET 4.0 System.Threading.Tasks学习笔记
- 钳工下料软件_钳工。 更开心 更具生产力。 远程工作。
- 特殊类型结构--枚举
- python 线程超时设置_爬虫基础知识(一)多线程与threading模块
- os库的基本使用(复习)
- emacs工程管理,cedet ede插件自动构建Make,Automake
- STM32F107VCTx I2C通信
- php mysql stmt_PHP mysqli_stmt_init() 函数 | 菜鸟教程
- 【论文解读 WSDM 2020 | KRF】Integrating Knowledge Relations into Style Correlations for 多标签音乐风格分类
- 百度网页不能连接服务器错误,win10系统登陆百度浏览器提示连接服务器错误的恢复步骤...
- Windows Server 2008安装配置IIS
- 宁畅g40系列服务器发布,基于第三代至强可扩展处理器,宁畅G40系列服务器正式发布...
- WorkPlus移动办公平台,助力企业随时随地“指尖办公”
热门文章
- MSP430F5529 DriverLib 库函数学习笔记(八)模数转换模块(ADC12)
- HTML中各种 div 位置距离关系
- linux下串口的阻塞和非阻塞操作
- Ubuntu 12.04 LTS安装VMware Tools:无法找到kernel header path的问题
- Python 用hashlib求中文字符串的MD5值
- 飞凌开发板 cramfs 镜像文件修改
- 对vector中的数据排序
- 前端学习(3079):vue+element今日头条管理-数据筛选处理
- [css] box-sizing的宽度包含了哪些?
- 工作171:阅读账号里面的新增调用接口操作