最近学习了一下关于Trie的一些姿势,感觉很实用。

终于不用每次看到字符串判重等操作就只想到hash

关于Trie的定义,来自百度百科

在计算机科学中,Trie,又称前缀树或字典树,是一种有序树状的数据结构,用于保存关联数组,其中的键通常是字符串。

说的有点高级,我们不要管它,可以看这样一张图:

这棵Trie中的单词共有:his,he,her,me,your

就是从根节点一直到某个有end(结尾)标记的点

可以发现,Tire其实就是把一些字符串的公用前缀字符存储了下来

Tire的实现更是简单:

  1. 建立一棵Trie,初始时只有一个空的根节点(编号为0)

  2. 每当插入或删除时,如果当前字符在之前的操作中已经建立,然后直接利用即可,否则新建立一个节点并让上一个节点连上它

  3. 当一个字符串结束时,给该节点做个记号,同时也可存储些其它的信息

具体的实现方法也有两种:邻接表邻接矩阵

在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的一些算法相关推荐

  1. 提高篇 第二部分 字符串算法 第3章 Trie字典树

    Trie(字典树)解析及其在编程竞赛中的典型应用举例 - Reqaw - 博客园 『一本通』Trie字典树 - YeLingqi - 博客园 字典树(Trie Tree) - 仰望高端玩家的小清新 - ...

  2. vue表情包渲染,trie算法实现,表情包资源分享

    表情包图片资源 https://yuan-1252477692.cos.ap-guangzhou.myqcloud.com/blog/files/emoticon.zip data.json {&qu ...

  3. 数据结构与算法学习-开篇

    前言 数据结构和算法这门课一直是计算机专业最基础的一门课,大学时期掌握的不够好,毕业后长期写业务,也没有特别的花时间好好攻克一下,一直是自己的短板.这次在极客时间上订阅了两门数据结构和算法方面的专栏, ...

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

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

  5. 数据结构与算法总结(完结)

    极客时间算法学习之后开始跟着花花酱刷题.大概从4月份开始的.从今天开始(2020-8-24)开始做总结,复习一下已经刷过的题目.到目前为止leetcode刷题323道. 2020/8/24 完成题目整 ...

  6. 双数组trie树的基本构造及简单优化

    一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...

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

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

  8. 汉语词典快速查询算法研究

    原贴:http://www.nlp.org.cn/docs/docredirect.php?doc_id=1118 汉语词典快速查询算法研究 李江波 周强 陈祖舜 (清华大学智能技术与系统国家重点实验 ...

  9. Trie 前缀树的c 实现

    Trie树,又称为字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树数据结构. 用于保存大量的字符串.它的优点是:利用字符串的公共前缀来节约存储空间. Trie的核心思想是空间换时 ...

最新文章

  1. MarkdownPad2 免费升级pro版本
  2. C# 子窗口修改主窗口的控件
  3. Shape Drawable Xml的background
  4. 24、Power Query-数学运算的应用(统计男女人数)
  5. html5做旋转太极图,HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)...
  6. for循环的break和continue
  7. HDU 5882 Balanced Game 分析+欧拉图
  8. NET 4.0 System.Threading.Tasks学习笔记
  9. 钳工下料软件_钳工。 更开心 更具生产力。 远程工作。
  10. 特殊类型结构--枚举
  11. python 线程超时设置_爬虫基础知识(一)多线程与threading模块
  12. os库的基本使用(复习)
  13. emacs工程管理,cedet ede插件自动构建Make,Automake
  14. STM32F107VCTx I2C通信
  15. php mysql stmt_PHP mysqli_stmt_init() 函数 | 菜鸟教程
  16. 【论文解读 WSDM 2020 | KRF】Integrating Knowledge Relations into Style Correlations for 多标签音乐风格分类
  17. 百度网页不能连接服务器错误,win10系统登陆百度浏览器提示连接服务器错误的恢复步骤...
  18. Windows Server 2008安装配置IIS
  19. 宁畅g40系列服务器发布,基于第三代至强可扩展处理器,宁畅G40系列服务器正式发布...
  20. WorkPlus移动办公平台,助力企业随时随地“指尖办公”

热门文章

  1. MSP430F5529 DriverLib 库函数学习笔记(八)模数转换模块(ADC12)
  2. HTML中各种 div 位置距离关系
  3. linux下串口的阻塞和非阻塞操作
  4. Ubuntu 12.04 LTS安装VMware Tools:无法找到kernel header path的问题
  5. Python 用hashlib求中文字符串的MD5值
  6. 飞凌开发板 cramfs 镜像文件修改
  7. 对vector中的数据排序
  8. 前端学习(3079):vue+element今日头条管理-数据筛选处理
  9. [css] box-sizing的宽度包含了哪些?
  10. 工作171:阅读账号里面的新增调用接口操作