用途

有人说是为了统计字频,可我觉得 HashMap 就可以完成。有人说比 HashMap 占用内存要小,但我感觉小也小不到哪里去。

有人说为了查询字符,还是那句话,HashSet 表示我也可以。

也许在 Hash 没有出来前,它也许在这些领域占有一席之地。目前,从数据结构来看,我认为它的作用也许在以下方面比较突出:

  • 也被称为 前缀树,就是剔除相同的前缀操作,这里看不懂很正常,后面慢慢说
  • 搜索提示,讲了下面结构你就理解了

结构

这就是字典树,我们沿着最左边走一遭,那就是 JOHNNY。

先来说下之前提到的第一个用途,前缀树。比如有两个字符串, JOHNNY 和 JOHN。可以发现两者拥有前缀,JOHN,这有什么作用呢?数据压缩的时候也许会用到,可以看这题。

820. 单词的压缩编码

接下来,说说第二个功能。比如你在搜索框中输入了 JO,那我根据字典树,我猜测你要找的也许是 JOHNNY 或者 JOE,然后我会给你提示。

定义数据结构

讲一个数据结构,主要就讲,如何去定义一个数据结构,然后涉及相关的操作,这里就是添加(搭建)、删除操作。

因为这也是一个树的结构,只不过这里不一定是二叉树,上面的图有点误导,我们如果要表示英文字符的话,那么从根节点出发,应该有26个字符可供选择。

class NodeTree{// 用数组编号代替字符,会减小搜索查询时间复杂度NodeTree[] charNode;// 记录下面子节点被使用个数,为了删除操作int count = 0;NodeTree(){charNode = new NodeTree[26];}
}

添加(构建)

添加和构建,本质是一样的,构建是通过一定数目的添加实现的。

    // 直接添加字符串public void addString(String s, NodeTree root){for(int i = 0; i < s.length(); i++){char c = s.charAt(i);if(root.charNode[c-'a']==null)root.charNode[c-'a'] = new NodeTree();root = root.charNode[c-'a'];root.count++;}}// 单个添加字符public NodeTree addChar(char c, NodeTree root){if(root.charNode[c-'a']==null)root.charNode[c-'a'] = new NodeTree();root.count++;return root.charNode[c-'a'];}

为了验证是否添加成功,写一个查找字符的函数

    public boolean findString(String s, NodeTree root){boolean flag = false;for(int i = 0; i < s.length(); i++){char c = s.charAt(i);if(root.charNode[c-'a']==null)return flag;root = root.charNode[c-'a'];}return !flag;}

小测试

public class TrimTree {public static void main(String[] args) {NodeTree root = new NodeTree();root.addString("test", root);System.out.println(root.findString("tes", root));System.out.println(root.findString("test", root));System.out.println(root.findString("tests", root));}
}
// 输出
true
true
false

上面这个测试,向字典树中写入,test,然后对test的前缀,tes进行查询,可以正常查询到。

字典树(前缀树/后缀树)相关推荐

  1. 从Trie树(字典树)和后缀树

    从Trie树(字典树)谈到后缀树 转载:http://blog.csdn.net/v_july_v/article/details/6897097#t22 感谢作者,侵删. 引言 常关注本blog的读 ...

  2. 012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树

    一.哈希树概述 1.1..其他树背景 二叉排序树,平衡二叉树,红黑树等二叉排序树.在大数据量时树高很深,我们不断向下找寻值时会比较很多次.二叉排序树自身是有顺序结构的,每个结点除最小结点和最大结点外都 ...

  3. 表达式树前缀中缀后缀表达式

    表达式树( expression tree ), 表达式树的树叶是操作数( operand ),比如常数或变量,而其他的节点为操作符( operator )如: 由于这里所有的操作都是二元的,因此这棵 ...

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

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

  5. NOI数据结构:后缀树

    NOI数据结构:后缀树 后缀树_fanzitao的专栏-CSDN博客_后缀树 后缀树 - sangmado - 博客园 字符串-后缀树和后缀数组详解 字符串-后缀树和后缀数组详解_吴泽龙的博客-CSD ...

  6. 后缀树(Suffix tree)

    概述 后缀树,就是把一串字符的所有后缀保存并且压缩的字典树.相对于字典树来说,后缀树并不是针对大量字符串的,而是针对一个或几个字符串来解决问题.比如字符串的回文子串,两个字符串的最长公共子串等等. 性 ...

  7. 后缀树系列一:概念以及实现原理( the Ukkonen algorithm)

    首先说明一下后缀树系列一共会有三篇文章,本文先介绍基本概念以及如何线性时间内构件后缀树,第二篇文章会详细介绍怎么实现后缀树(包含实现代码),第三篇会着重谈一谈后缀树的应用. 本文分为三个部分, 首先介 ...

  8. 看动画学算法系列之:后缀树suffix tree

    文章目录 简介 字典树Trie 压缩字典树 后缀树Suffix Tree 后缀树的搜索 查找最长重复子字符串 查找两个字符串的最长公共子字符串 后缀树的代码实现 简介 模式匹配是一个在工作中经常会用到 ...

  9. UKK算法构建后缀树

    后缀树 详情 定义 后缀树是一种数据结构,一个具有 m 个字符的字符串 S 的后缀树 T,就是一个包含一个根节点的有向树,该树恰好带有 m+1 个叶子(包含空字符),这些叶子被赋予从 0 到 m 的 ...

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

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

最新文章

  1. 从文本分类来看图卷积神经网络
  2. 《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.9 打包和混合纹理
  3. 此服务器的时钟与主域控制器的时钟不一致_中移动“超高精度时间同步服务器”开标,两家中标...
  4. php里面没有mssql,为什么没有正确使用PHP / MSSQL的日期/时间?
  5. JS事件循环 Event Loop
  6. 一季度平板电脑市场:苹果稳居第一,华为第二!
  7. 计算机语言分类:机器语言、汇编语言、标记语言、脚本语言、编程语言
  8. arm cpu的架构及分类说明
  9. 基于RFID的物联网系统
  10. 一篇文章带你深入了解Dart语言
  11. linux系统重装win系统教程,Win10如何重装linux系统 Win10重装linux系统教程
  12. 云数据库PostgreSQL新人怎样上手
  13. redis实现setnx,setex连用实现分布式锁
  14. Salesforce触发器面试题
  15. 开发的激光测距仪PCBA方案设计
  16. 2014阿里校园招聘软件工程师笔试题(9.22武汉站)
  17. java unix时间戳_Java与Unix时间戳的相互转换
  18. 一年换12次女朋友,绝了
  19. 怎么实时监控手机cpu-----使用性能监视器PerfMon
  20. 分享UCI两个可用于预测的数据集Diabetes和Heart Disease

热门文章

  1. vscode中setting的设置
  2. 如何快速进入/打开cmd--快捷键
  3. g729编解码的总结
  4. CAN应用层常用协议
  5. JS中实现继承的几种方式
  6. java基础学习1-java实验输出希腊字母表
  7. ios 集成阿里云推送通知的注意点
  8. 用计算机软件绘制思维导图,无需其他软件!用Word 2016快速制作思维导图
  9. PSCC2014前端切图小方法(不断补充)
  10. 从30天到17小时,如何让HSPICE仿真效率提升42倍?