Trie入门讲解
我们常常用Trie(也叫前缀树)来保存字符串集合。如下图所示就是一个Trie。

上图表示的字符串集合为$\{a,to,tea,ted,ten,i,in,inn \}$,每个单词的结束位置对应一个“单词结点”。反过来,从根节点到每个单词结点的路径上的所有字母(不是结点上的字母)连接而成的字符串就是该结点对应的字符串。在程序上,将根节点编号为0,然后把其余结点编号为从1开始的正整数,然后用一个数组来保存每个结点的所有子节点,用下标直接存取。
具体来说,可以用$ch[i][j]$保存结点$i$的那个编号为$j$的子结点。为什么叫“编号为$j$呢?”比如,若是处理全部由小写字母组成的字符串,把所有小写字母按照字典序编号为0,1,2,...,则$ch[i][0]$表示结点$i$的子结点$a$。如果这个子结点不存在,则$ch[i][0]=0$。用sigma_size表示字符集的大小,比如,当字符集为全体小写字母时,sigma_szie=26。
使用Trie的时候,往往需要在单词结点上附加信息,其中$val[i]$表示结点$i$对应的附加信息。例如,如果每个字符串有一个权值,就可以把这个权值保存在$val[i]$中。简单起见,下面的额代码假定权值大于0,因此$val[i]>0$当且仅当结点$i$是单词结点(即val为0表示中间结点)。
Trie的定义、插入和查找的代码:
struct Trie
{
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
void clear(){ sz = ; memset(ch[], , sizeof(ch[])); } int idx(char c) { return c - 'a'; } //字符c的编号 //插入字符串s,附加信息为v。注意v必需非0,因为0代表"本结点不是单词结点"
void insert(const char *s, int v)
{
int u = , n = strlen(s);
for (int i = ; i < n; i++)
{
int c = idx(s[i]);
if (!ch[u][c])
{
memset(ch[sz], , sizeof(ch[sz]));
val[sz] = ; //中间结点的附加信息为0
ch[u][c] = sz++; //新建结点
}
u = ch[u][c]; //往下走
}
val[u] = v; //字符串的最后一个字符的附加信息为v
} //找字符串s的长度不超过len的前缀
void find(const char* s, int len, vector<int>& ans)
{
int u = ;
for (int i = ; i < len; i++)
{
if (s[i] == '\0') break;
int c = idx(s[i]);
if (!ch[u][c]) break;
u = ch[u][c]; //往下走
if (val[u] != ) ans.push_back(val[u]); //找到一个前缀
}
}
};
Trie入门讲解的更多相关文章
- poj1056 (Trie入门)寻找字符串前缀
题意:给你一堆字符串,问是否满足对于任意两个字符串a.b,a不是b的前缀 字典树==前缀树==Trie树 trie入门题,只用到了insert和query操作 #include <cstdio& ...
- Mysql C语言API编程入门讲解
原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程. ...
- #001 CSS快速入门讲解
CSS入门讲解 HTML人+CSS衣服+JS动作=>DHTML CSS: 层叠样式表 CSS2.0 和 CSS3.0 版本,目前学习CSS2, CSS3只是多了一些样式出来而已 CSS 干啥用的 ...
- HTML5游戏开发引擎Pixi.js新手入门讲解
在线演示 本地下载 这篇文章中,介绍HTML5游戏引擎pixi.js的基本使用. 相关代码如下: Javascript 导入类库:(使用极客的cdn服务:http://cdn.gbtags.com) ...
- AngularJS入门讲解4:多视图,事件绑定,$resource服务讲解
上一课,大家知道,手机详细模板我们没有写出来,使用的是一个占位模板. 这一课,我们先实现手机详细信息视图,这个视图会在用户点击手机列表中的一部手机时被显示出来. 为了实现手机详细信息视图,我们将会使用 ...
- poj2104 k-th number 主席树入门讲解
poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树 刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...
- #001 HTML快速入门讲解
整理了下最早开始学习技术的笔记 3W1H学习法? (其他技术同理) What HTML是什么? When 什么时候使用HTML? Why 为什么使用HTMl? HOW 怎么使用HTML ...
- 原生AJAX入门讲解(含实例)
相对于jQuery.YUI以及其他一些类库的AJAX封装,原生JS的AJAX显得那么的尴尬,兼容性不好,要记很多的方法属性,调用不便捷,代码臃肿...但我还是想说,原生JS才是最根本最底层的知识(虽然 ...
- hadoop中HBase子项目入门讲解
HBase 是Hadoop的一个子项目,HBase采用了Google BigTable的稀疏的,面向列的数据库实现方式的理论,建立在hadoop的hdfs上,一方面里用了hdfs的高可靠性和可伸缩行, ...
随机推荐
- C++ - main()函数参数
main()函数及其参数说明 main()函数主要形式: int main(void) int main(int argc, char *argv[]) = int main(int argc, ch ...
- 从头开始学Web开发—CSS_01
CSS导入使用及引用的两种方法: 外部引用 外部引用的方式,我们直接可以通过link标签来引用我们写好的一个CSS文件: 在link 标签中,我们通过rel = "stylesheet&qu ...
- Codeforces617E【莫队算法+前缀异或】
题意: 给出一系列数,对每个查询区间,计算有多少个子区间异或为k. 思路: 可以先预处理异或前缀,一个区间[L,R]的异或值=sum[R]^sum[L-1]; 如果当前区间是[a,b],加一个右端点b ...
- 湖南集训day7
难度:☆☆☆☆☆☆ /* 由观察可知 同种颜色的减去他的父亲值相同 我们考虑把询问的两个数分别减去小于它的最大斐波那契数. */ #include<iostream> #include&l ...
- 【TIDB】3、数据库的发展历史、现在、未来
1.从单机数据库说起(Mysql.Oracle.PostgreSQL) 关系型数据库起源自1970年代,其最基本的功能有两个: 把数据存下来: 满足用户对数据的计算需求. 第一点是最基本的要求,如果一 ...
- 求n位水仙花数
求n位水仙花数 A.两个关键 1.n位水仙花数的范围是什么? n位水仙花数的范围是[10n-1,10n) 2.如何判断是否为水仙花数 核心操作: 2-1.如何得到每一位? A.核心思想 对得到的数进行 ...
- 7-36 旅游规划 (25 分(Dijkstra)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便 ...
- 不可见类有抽象父类,spring配置子类bean,注入父类,aop就可以切父类的方法
public class TestBeanChild { int b = 1; public TestBean createDefault() { return new TestBeanDefault ...
- 【手撸一个ORM】第一步、实体约定和描述
一.约定 数据实体必须实现 IEntity 接口,该接口定义了一个int类型的Id属性,既每个实体必须有一个名称为Id的自增主键. 若数据表的主键列名称不是Id,可以通过 [MyKey("主 ...
- Spark Mllib里决策树回归分析如何对numClasses无控制和将部分参数设置为variance(图文详解)
不多说,直接上干货! 在决策树二元或决策树多元分类参数设置中: 使用DecisionTree.trainClassifier 见 Spark Mllib里如何对决策树二元分类和决策树多元分类的分类 ...