使用静态数组的nxt指针的设计,大概比使用map作为nxt指针的设计要快1倍,但空间花费大概也大1倍。在数据量小的情况下,时间和空间效率都不及map<vector,int>。map<vector,int>的最坏情况下效率为O(nlogn*len),而Trie的效率为O(n*len),但是实际上测出来还是map快一点,有可能在vector实际比较的时候很快就得出大小了。

**1. 注意修改Query的实现,默认找不到结果是返回0,就算找到也未必代表字符串在里面出现过,也可能是字符串的其中一个前缀。 **

**2. 注意我写的字符串都是从1开始的,所以传进来的字符串指针不需要+1。 **

**3. 注意MAXN并不是最大的句子的个数,而是最大的节点的个数,也就是 \(MAXN=n*len\)。 **

时间复杂度:

初始化: \(O(\Sigma)\)

插入: \(O(len*\Sigma)\)

查询: \(O(len)\)

空间复杂度:

\(O(n*len*\Sigma)\)

struct TrieNode {
int data;
int nxt[26]; void Init() {
data = 0;
memset(nxt, 0, sizeof(nxt));
}
}; struct Trie {
static const int MAXN = 200000;
TrieNode tn[MAXN + 5];
int root, top; int NewNode() {
tn[++top].Init();
return top;
} void Init() {
top = 0;
root = NewNode();
} void Insert(char *a, int len, int data) {
int cur = root;
for(int i = 1; i <= len; ++i) {
int &nxt = tn[cur].nxt[a[i] - 'a'];
if(!nxt)
nxt = NewNode();
cur = nxt;
}
tn[cur].data = data;
} int Query(char *a, int len) {
int cur = root;
for(int i = 1; i <= len; ++i) {
int &nxt = tn[cur].nxt[a[i] - 'a'];
if(!nxt)
return 0;
cur = nxt;
}
return tn[cur].data;
}
} trie;

模板 - 字符串/数据结构 - 字典树/Trie的更多相关文章

  1. Java数据结构——字典树TRIE

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

  2. 『字典树 trie』

    字典树 (trie) 字典树,又名\(trie\)树,是一种用于实现字符串快速检索的树形数据结构.核心思想为利用若干字符串的公共前缀来节约储存空间以及实现快速检索. \(trie\)树可以在\(O(( ...

  3. 字典树(Trie)详解

    详解字典树(Trie) 本篇随笔简单讲解一下信息学奥林匹克竞赛中的较为常用的数据结构--字典树.字典树也叫Trie树.前缀树.顾名思义,它是一种针对字符串进行维护的数据结构.并且,它的用途超级广泛.建 ...

  4. 字典树 trie树 学习

    一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种   二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...

  5. [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序

    一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 ...

  6. 字典树trie学习

    字典树trie的思想就是利用节点来记录单词,这样重复的单词可以很快速统计,单词也可以快速的索引.缺点是内存消耗大 http://blog.csdn.net/chenleixing/article/de ...

  7. 【字符串算法】字典树(Trie树)

    什么是字典树 基本概念 字典树,又称为单词查找树或Tire树,是一种树形结构,它是一种哈希树的变种,用于存储字符串及其相关信息. 基本性质 1.根节点不包含字符,除根节点外的每一个子节点都包含一个字符 ...

  8. hdu1251 字典树trie 模板题

    //字典树模板题.题意:给一个库,每次查询,求以之为前缀的单词数量. #include<iostream> #include<string> #include<vecto ...

  9. 算法与数据结构基础 - 字典树(Trie)

    Trie基础 Trie字典树又叫前缀树(prefix tree),用以较快速地进行单词或前缀查询,Trie节点结构如下: //208. Implement Trie (Prefix Tree)clas ...

随机推荐

  1. wbSocket

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. BUAA OO 2019 第三单元作业总结

    目录 总 JML规格化设计 理论基础 工具链 规格验证 验证代码 代码静态检查 自动生成测试样例 生成结果 错误分析 作业设计 第九次作业 架构 代码实现 第十次作业 架构 代码实现 第十一次作业 架 ...

  3. flask_mail使用

    python3里发送邮件使用smtplib模块,内置得,不用下载安装,直接导入即可 smtplib使用实例 import smtplib from email.mime.text import MIM ...

  4. centos6/7添加系统服务

    服务脚本必须存放在/etc/ini.d/目录下:       chkconfig --add mongodb     chkconfig --list mongodb     等级0表示:表示关机   ...

  5. chrome DevTools功能介绍

  6. WebService知识点

    Web Services简介: 什么是Web Services? Web Services 是应用程序组件 Web Services 使用开放协议进行通信 Web Services 是独立的(self ...

  7. awk命令笔记

    awk是啥? awk(奥克)是linux中一个强大的分析工具,linux面试必考 [root@rainbol ~]# awk Usage: awk [POSIX or GNU style option ...

  8. Gradient Boosting Decision Tree

    GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类.当采用平方误差损失函数时,每一棵回归树学习的是之前所有树的结论和残差,拟合得到一个当前的残差回归树,残差的意义如公式 ...

  9. Ecshop漏洞通杀0day【最新入侵手法】

    昨晚上翻阅一本技术书籍中,找到灵感,发现的ECshop漏洞. 搜索关键字:关键字:powered by ecshop 方法一: 普通代码: user.php?act=order_query&o ...

  10. drf框架 - 序列化组件 | Serializer

    序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...