Trie,又名字典树、单词查找树,可以较高效地实现统计、排序和保存大量的字符串。


顾名思义,Trie是一个树状的结构,按照树型结构来存储字符串,显然是一种以空间换时间的方法。整体上理解和实现都不会很难。

下面是实现方法:

插入:

  • 当我们往一棵Trie中插入一个字符串时,我们先定义一个指针p指向根节点,然后依次扫描字符串的元素,设其为s;
  • 若s字符指向的是一个已存在的节点,设其为q,则令p=q;若s字符指向的一个是空节点,则新建一个节点,设其为q,并令p=q;
  • 按照上面的步骤将字符串的元素扫描完毕后,将当前的p标记为一个字符串的末尾。

代码:

int p=0;
for(int i=0;i<s.size();i++)
{
if(!trie[p][s[i]-'a'])
trie[p][s[i]-'a']=++tot;//指向新节点
p=trie[p][s[i]-'a'];//取出指针
}
end[p]=true;

查找:

  • 当我们要在一颗Trie中查找一个字符串是否存在时,我们先定义一个指针p指向根节点,然后依次扫描字符串的元素,设其为s;
  • 若s字符指向的是一个空节点,则说明s没有被插入过这棵Trie;若s字符指向的是一个已存在的节点,设其为q,则令p=q;
  • 按照上面的步骤将字符串的元素扫描完毕后,若当前的p为一个字符串的末尾,则该字符串存在于这棵Trie中;反之则不存在。

代码:

int p=0;
for(int i=0;i<s.size();i++)
{
p=trie[p][s[i]-'a'];//取出指针
if(!p)
return 0;
}
return end[p];

它大概长这样:(来自lyd的蓝书)

完整代码:

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int n,m,tot=1,trie[SIZE][26];//trie数组存的就是指针
bool end[SIZE];//SIZE表示所有字符串的长度之和
string s;
void add()
{
int p=0;
for(int i=0;i<s.size();i++)
{
if(!trie[p][s[i]-'a'])
trie[p][s[i]-'a']=++tot;
p=trie[p][s[i]-'a'];
}
end[p]=true;
}
int get()
{
int p=0;
for(int i=0;i<s.size();i++)
{
p=trie[p][s[i]-'a'];
if(!p)
return 0;
}
return end[p];
}
int main()
{
memset(end,false,sizeof(end));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s;
add();
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>s;
int ans=get();
if(ans)
cout<<"OK"<<endl;
else
cout<<"WRONG"<<endl;
}
return 0;
}

(注:以上代码中字符串默认为只由小写字母构成,有的部分要根据实际情况改变)


习题:


2019.3.21 于厦门外国语学校石狮分校

Trie详解的更多相关文章

  1. 字典树(Trie)详解

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

  2. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  3. trie树--详解

    文章作者:yx_th000 文章来源:Cherish_yimi (http://www.cnblogs.com/cherish_yimi/) 转载请注明,谢谢合作.关键词:trie trie树 数据结 ...

  4. 转:trie树--详解

    前几天学习了并查集和trie树,这里总结一下trie. 本文讨论一棵最简单的trie树,基于英文26个字母组成的字符串,讨论插入字符串.判断前缀是否存在.查找字符串等基本操作:至于trie树的删除单个 ...

  5. [转] AC自动机详解

    转载自:http://hi.baidu.com/nialv7/item/ce1ce015d44a6ba7feded52d AC自动机详解 AC自动机是用来处理多串匹配问题的,即给你很多串,再给你一篇文 ...

  6. 【转】AC算法详解

    原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...

  7. 以太坊客户端Geth命令用法-参数详解

    Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...

  8. HanLP中人名识别分析详解

    HanLP中人名识别分析详解 在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: l ·名字识别的问题 #387 l ·机 ...

  9. HanLP中的人名识别分析详解

    在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: u u名字识别的问题 #387 u u机构名识别错误 u u关于层叠H ...

随机推荐

  1. day19:os模块&shutil模块&tarfile模块

    os模块:对系统进行操作(6+3) system  popen  listdir  getcwd  chdir  environ / name  sep  linesep import os #### ...

  2. odoo12的视图常见属性和操作

    1.菜单视图属性: 常用属性: name是展示在用户界面中的菜单项标题 action是点击菜单项时运行的窗口操作的XML ID parent是父级菜单项的XML ID.本例中父级项由其它模块创建,因此 ...

  3. Redis实现商品热卖榜

    Redis系列 redis相关介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合 ...

  4. day15.递归函数

    一.递归函数 """ 自己调用自己的函数就是递归 递: 去 归: 回 一去一回就是递归 """ 例. def digui(n): print ...

  5. .Net Core 3.0依赖注入替换 Autofac

    今天早上,喜庆的更新VS2019,终于3.0正式版了呀~ 有小伙伴问了一句Autofac怎么接入,因为Startup.ConfigureServices不能再把返回值改成IServiceProvide ...

  6. 3月28日考试 题解(二分答案+树形DP+数学(高精))

    前言:考试挂了很多分,难受…… --------------------- T1:防御 题意简述:给一条长度为$n$的序列,第$i$个数的值为$a[i]$.现让你将序列分成$m$段,且让和最小的一段尽 ...

  7. vue-cli脚手架的搭建

    1.安装node.js 2.安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 3.安装vue-cli npm ...

  8. 用python分析1225万条淘宝数据,终于搞清楚了我的交易行为

    大家好,我是黄同学

  9. .NET Core Web APi大文件分片上传研究

    前言 前两天发表利用FormData进行文件上传,然后有人问要是大文件几个G上传怎么搞,常见的不就是分片再搞下断点续传,动动手差不多也能搞出来,只不过要深入的话,考虑的东西还是很多.由于断点续传之前写 ...

  10. 漏洞重温之XSS(上)

    漏洞简介 跨站脚本攻击(XSS)是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览页面之时,嵌入web网页中的script代码会被执行,从而达到恶意攻击用户的目的. XSS漏洞通常是通过 ...