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. 字典内置函数&方法

    字典内置函数&方法 Python字典包含了以下内置函数:高佣联盟 www.cgewang.com 序号 函数及描述 1 cmp(dict1, dict2)比较两个字典元素. 2 len(dic ...

  2. PHP timezone_location_get() 函数

    ------------恢复内容开始------------ 实例 返回指定时区的位置信息: <?php$tz=timezone_open("Asia/Taipei");ec ...

  3. Skill 中的通用输出格式规范

    https://www.cnblogs.com/yeungchie/ Skill中的通用输出格式规范 Common Output Format Specifications Format Specif ...

  4. springboot2.1.x版本报错总结

    我使用的是springboot  2.1.7.RELEASE  springcloud  Greenwich.SR2 boot和cloud对应的版本号不能搞混,对应版本请参考https://sprin ...

  5. SpringBoot之Quartz基础

    前言:由于我们本项目选用的Springboot来整合Quartz,官方给我们提供了启动器所以很简单.在以前的版本我们想要使用Quartz需要引入的依赖如下: <dependency> &l ...

  6. Spring Cloud Data Flow初体验,以Local模式运行

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring Cloud Data Flow是什么,虽然已经出现一段时间了,但想必很多人不知道,因为在项目中很少有人用.不仅 ...

  7. 当asp.net core偶遇docker一(模型验证和Rabbitmq 二)

    上一篇我们说到构建了一个Rabbitmq容器 现在我们说说如何在一个悄悄传输消息到队列 我们现在设计一个Rabbitmq发送消息部分的模块 先设计一个远程发送的接口 public interface ...

  8. 某大型企业ospf面试题分析(含路由策略和路由过滤,及双点双向重发布)

    面试问题背景 本面试题来自国内最大通信技术公司之一,央企,有很多金融网项目. 了解行业的同学,一定知道事哪个企业. 上面试问题(取自百哥收集整理的面试总结大全,关注百哥CSDN或知乎,不定期分享名企面 ...

  9. 集中式版本管理系统 SVN使用

    SVN的使用 SVN的文件状态 黑色:正常的文件 黄色文件(在Android Stduio中颜色):被忽略的文件 红色:文件没有Add的新文件(没有加入版本控制subversion中) 绿色:新文件A ...

  10. 解决@ResponseBody不能和 <mvc:annotation-driven>同时使用的问题

    我们都知道使用Springmvc的ajax很强大只要三步就可以实现: 1.引入jackson的maven到pom文件: <dependency> <groupId>com.fa ...