Trie树就是字典树,其核心思想就是空间换时间。

举个简单的例子。

给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,第一次出现第几个位置。
这题当然可以用hash来,但是我要介绍的是trie树。在某些方面它的用途更大。比如说对于某一个单词,我要询问它的前缀是否出现过。这样hash就不好搞了,而用trie还是很简单。
现在回到例子中,如果我们用最傻的方法,对于每一个单词,我们都要去查找它前面的单词中是否有它。那么这个算法的复杂度就是O(n^2)。显然对于100000的范围难以接受。现在我们换个思路想。假设我要查询的单词是abcd,那么在他前面的单词中,以b,c,d,f之类开头的我显然不必考虑。而只要找以a开头的中是否存在abcd就可以了。同样的,在以a开头中的单词中,我们只要考虑以b作为第二个字母的……这样一个树的模型就渐渐清晰了……
假设有b,abc,abd,bcd,abcd,efg,hii这6个单词,我们构建的树就是这样的。

对于每一个节点,从根遍历到他的过程就是一个单词,如果这个节点被标记为红色,就表示这个单词存在,否则不存在。
那么,对于一个单词,我只要顺着他从跟走到对应的节点,再看这个节点是否被标记为红色就可以知道它是否出现过了。把这个节点标记为红色,就相当于插入了这个单词。
这样一来我们询问和插入可以一起完成,所用时间仅仅为单词长度,在这一个样例,便是10。
我们可以看到,trie树每一层的节点数是26^i级别的。所以为了节省空间。我们用动态链表,或者用数组来模拟动态。空间的花费,不会超过单词数×单词长度。

字典树(Trie树)相关推荐

  1. HDU 1247 Hat’s Words 字典树(Trie树)

    HDU 1247 Hat's Words 字典树(Trie树) 字典树的建立是应该都是一样的 下面是我的做法: 建立完后, 对每一个单词都进行find_string()判断是否符合, 分别对其分成两半 ...

  2. java工具:字典树(单词查找树/Trie树)的实现以及使用

    项目地址 https://github.com/kylin-hunter/k-dic 文章目录 项目地址 前言 一.字典树 二.使用步骤 1 引入库 1.1 编译并发布到本地 1.2 gradle ( ...

  3. 字典树(trie树)、后缀树

    (1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...

  4. 【BZOJ3217】ALOEXT-暴力重构线段树-替罪羊树-Trie树-树套树-10k大代码(+数据生成器)...

    Problem ALOEXT 题目大意 给出一个数据结构维护一个数列,要求支持以下操作: 向数列中某个位置插入一个数 将数列中某个位置的数删除 将数列中某个位置的数换成另外一个数 查询一段区间内的次大 ...

  5. LeetCode 14. Longest Common Prefix字典树 trie树 学习之 公共前缀字符串

    所有字符串的公共前缀最长字符串 特点:(1)公共所有字符串前缀 (好像跟没说一样...) (2)在字典树中特点:任意从根节点触发遇见第一个分支为止的字符集合即为目标串 参考问题:https://lee ...

  6. Trie树(字典树)详细知识点及其应用

    Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...

  7. Day10 堆排序、模拟堆 trie树(字典树) 并查集

    堆呢就是一棵树完全二叉树... 小根堆的话,根节点就是最小值 维护堆只有两个操作 up(k) down(k) cnt是堆的大小 建堆的话只需要把前n/2的数down下来就ok 复杂度是小于O(n) 的 ...

  8. 【转】从Trie树(字典树)谈到后缀树

    本文第一部分,咱们就来了解这个Trie树,然后自然而然过渡到第二部分.后缀树,接着进入第三部分.详细阐述后缀树的构造方法-Ukkonen. 第一部分.Trie树 1.1.什么是Trie树 Trie树, ...

  9. Trie树 -- 高效的字典树

    文章目录 简介 原理 构造一棵Trie树 使用Trie树进行查询 实现 模拟(瞎暴力)实现 空间优化 简介 Trie树是一种数据结构,它有一个好听的中文名字,叫"字典树".顾名思义 ...

最新文章

  1. 定义css设备类型-Media Queries图表简介及使用方法
  2. JZOJ 5643. 【NOI2018模拟4.10】最小代价
  3. linux scp 输入密码,Linux scp远程复制数据不需要输入密码
  4. c# https请求
  5. ❤️ 爆赞,基础又全面的Linux命令合集!学都学不完...【汇总】
  6. 2018-2019-2 网络对抗技术 20165322 Exp9 Web安全基础
  7. 项目管理应该注意问题
  8. Numpy之文件存取
  9. 一个初学者的辛酸路程-常用模块-6
  10. 对象转json时,Date类型字段处理。
  11. GP数据库(三)杀进程
  12. 英文对于程序员的重要性
  13. seo优化之什么是死链接、导入链接、导出链接
  14. PCIE配置空间设置
  15. 类和对象7:构造和析构方法
  16. c语言如何判断当前是 空字符,c语言如何判断字串中没有没有某个字元?
  17. matlab怎么取消科学计数法_在MATLAB中更改数据科学计数法
  18. 小米一面经验分享,面试编程题
  19. 多传感器融合综述---FOV与BEV
  20. css-图片模糊处理-blur

热门文章

  1. bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列
  2. Golang入门教程(二)Ubuntu16.04下安装golang(实例:Golang 定时任务管理器)
  3. 理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虚拟网络
  4. iOS开发之窗口和视图
  5. PHP 学习 第一天
  6. luogu P2791 幼儿园篮球题
  7. 使用openssl生成双向加密证书(转)
  8. Python——常用模块
  9. 3ds max 渲染清晰面片的边缘
  10. 【T_SQL】 基础 事务