Trie(字典树,前缀树)_模板
Trie
Trie,又经常叫前缀树,字典树等等。
Trie,又称前缀树或字典树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,根节点不保存值,这样可以把几个开头不同的串连在一颗Trie上(如abc,efg)。Trie中的键通常是字符串(所以常叫字典树)。
优点
可以最大限度地减少无谓的字符串比较,故可以用于词频统计和大量字符串排序。
缺点
虽然不同单词共享前缀,但其实trie是一个以空间换时间的算法。其每一个字符都可能包含至多字符集大小数目的指针。
建树
两种建法:
(1) 多叉树:仅字母:26或52,各种字母,数字,符号组合:根据情况算吧,反正需要的空间贼大
(2) 兄弟儿子表示法:用链表,如链式前向星(个人比较喜欢),遍历时间较上一种长
应用
(1)字符串检索
(2)用多叉树建的树可以实现字典序排序
(3)最长公共前缀
(4)AC自动机等会用到
促使我学习Trie的题目:UVA 11732 "strcmp()" Anyone?
并没有UVA链接,其他OJ大概也搜得到
这道题给出一个 strcmp() 函数的实现方式,我们要求的就是判断 ‘==’ 的次数
int strcmp(char *s, char *t)
{
int i;
for (i = ; s[i] == t[i]; i++)
if (s[i] == ) return ;
return s[i] - t[i];
}
题面
由于要比较最后的 0,那么字符串相等则答案加 2 * strlen(str) + 2,否则加 2 * ptr + 1,ptr为中断位置。
代码
我使用的是兄弟儿子表示法(很显然),时间复杂度的话,不是很慢,还行吧 . . .
#include<cstdio>
#include<cstring>
#include<iostream>
#define CL(X,N) memset((X), (N), sizeof(X))
using namespace std;
typedef long long LL;
const int maxl = 1e3 + , maxn = 4e3 + ;
int n;
char str[maxl];
int son[maxn * maxl], bro[maxn * maxl], cnt[maxn * maxl];
char trie[maxn * maxl];
LL size = , ans = ; inline void Insert(char *s, int len) {
int ptr, cur = ;
for(int i = ; i <= len; ++i) {
for(ptr = son[cur]; ptr; ptr = bro[ptr])
if(trie[ptr] == s[i]) break;
if(!ptr) {
ptr = size++;
trie[ptr] = s[i];
bro[ptr] = son[cur];
son[cur] = ptr;
cnt[ptr] = ;
son[ptr] = ;
}
ans += (cnt[cur] - cnt[ptr]) * ( * i + );
if(i == len) {
ans += cnt[ptr] * ( * i + );
++cnt[ptr];
}
++cnt[cur];
cur = ptr;
}
return ;
} inline void Initialize(void) {
son[] = bro[] = cnt[] = ;
ans = ;
size = ;
return ;
} int main(int argc, char **argv) {
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif
int len, cas = ;
while(~scanf("%d", &n) && n) {
Initialize();
for(int i = ; i < n; ++i) {
scanf("%s", str);
len = strlen(str);
Insert(str, len);
}
printf("Case %d: %lld", ++cas, ans);
putchar();
}
return ;
}
Trie(字典树,前缀树)_模板的更多相关文章
- 9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第9章 查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚 ...
- [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)
Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...
- [LeetCode] 208. Implement Trie (Prefix Tree) 实现字典树(前缀树)
Implement a trie with insert, search, and startsWith methods. Example: Trie trie = new Trie(); trie. ...
- 内存空间有限情况下的词频统计 Trie树 前缀树
数据结构与算法专题--第十二题 Trie树 https://mp.weixin.qq.com/s/nndr2AcECuUatXrxd3MgCg
- Trie - leetcode [字典树/前缀树]
208. Implement Trie (Prefix Tree) 字母的字典树每个节点要定义一个大小为26的子节点指针数组,然后用一个标志符用来记录到当前位置为止是否为一个词,初始化的时候讲26个子 ...
- LeetCode OJ:Implement Trie (Prefix Tree)(实现一个字典树(前缀树))
Implement a trie with insert, search, and startsWith methods. 实现字典树,前面好像有道题做过类似的东西,代码如下: class TrieN ...
- HDU 1251 字典树(前缀树)
题目大意 :Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).(单词互不相同) ...
- TRIE 字典树 前缀紧急集合!
TRIE: 在计算机科学中,Trie,又称前缀树或字典树,是一种有序树状的数据结构,用于保存关联数组,其中的键通常是字符串.——百度百科 自我理解: trie树,是一种处理字符串前缀的数据结构,通常会 ...
- Trie(前缀树/字典树)及其应用
Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...
随机推荐
- Java NIO(四) Scatter/Gather
Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作.分散(sc ...
- 使用notebook 笔记(1)
1 去开启远程访问notebook 注意事项 安装好Ipython notebook 之后, 开启服务的方式如下: ipython notebook --profile=nbserver --ip= ...
- matlab矩阵
矩阵的转置用',比如: a = [1,2,3]; b = a'; %b 转置成一个列向量,可以用于矩阵 linspace是Matlab中的一个指令,用于产生指定范围内的指定数量点数,相邻数据跨度相同, ...
- 基于 Azure 托管磁盘配置高可用共享文件系统
背景介绍 在当下,共享这个概念融入到了人们的生活中,共享单车,共享宝马,共享床铺等等.其实在 IT 界,共享这个概念很早就出现了,通过 SMB 协议的 Windows 共享目录,NFS 协议的网络文件 ...
- Flask入门flask-script 蓝本 钩子函数(三)
1 flask-script扩展库 概念: 是一个flask终端运行的解析器 ,因为项目完成以后,代码改动会有风险,所以借助终端完成不同启动项的配置 安装 pip3 install flask-scr ...
- Android 位置服务
原文来自:http://developer.android.com/guide/topics/location/strategies.html 位置策略 注意: 本指南仅限android.locati ...
- POJ-1759 Garland---二分+数学
题目链接: https://cn.vjudge.net/problem/POJ-1759 题目大意: N个灯泡离地H_i,满足H1 = A ,Hi = (Hi-1 + Hi+1)/2 – 1,HN = ...
- Python 用多线程上传和下载文件
# -*- coding: utf-8 -*- __author__ = 'louis' from ftplib import FTP import multiprocessing import ti ...
- eclipce导出项目发布到tomcat
1.右击项目-Except 2.在弹出框中输入“WAR file” 3.点击“next” 在Destinatin选择保存路径,即可 4.将保存的文件复制到tomcat下,启动tomcat之后,会自动解 ...
- VirtualBox改变虚拟硬盘位置
原本放虚拟硬盘的位置容量不足,因此将原来的虚拟硬盘放到了一个相对空闲的分区.设置虚拟硬盘位置时出现一点小问题,解决过程记录如下. 1. 将虚拟硬盘复制到目标位置后,假设为“F:\Ubuntu 16.0 ...