字典树

字典树是一种树形结构,优点是利用字符串的公共前缀来节约存储空间。在这提供一个自己写的Java实现,非常简洁。

  • 根节点没有字符路径。除根节点外,每一个节点都被一个字符路径找到。
  • 从根节点到某一节点,将路径上经过的字符连接起来,为对应字符串。
  • 每个节点向下所有的字符路径上的字符都不同

每个结点维持两个变量的记录:path表示字符路过这个结点的次数(即表示存在以当前结点为前缀的字符有多少个);end记录以当前结点为结束的字符有多少个。

public class Main {public static void main(String[] args) {Trie trie = new Trie();trie.add("a");trie.add("ab");trie.add("ac");trie.add("abc");trie.add("acb");trie.add("abcc");trie.add("aab");trie.add("abx");trie.add("abc");System.out.println(trie.get("abc"));System.out.println(trie.getPre("ab"));}
}
/*** path表示字符路过这个结点的次数(即表示存在以当前结点为前缀的字符有多少个);* end记录以当前结点为结束的字符有多少个。*/
class TrieNode {public int path;public int end;public TrieNode[] nexts;public TrieNode() {path = 0;end = 0;//只能存英文小写字母,如果是ASCII码可以生成256大小的数组//如果想存更多种类的字符可以改为map结构nexts = new TrieNode[26];}
}class Trie {private TrieNode root;Trie() {root = new TrieNode();}/*** 字典树的加入过程*/public void add(String word) {if (word == null) return;char[] chars = word.toCharArray();TrieNode node = root;int index = 0;for (char c : chars) {index = c - 'a';if (node.nexts[index] == null) {node.nexts[index] = new TrieNode();}node = node.nexts[index];node.path++;}node.end++;}/*** 字典树查询目标单词出现的次数*/public int get(String word) {if (word == null) return 0;char[] chars = word.toCharArray();TrieNode node = root;int index = 0;for (char c : chars) {index = c - 'a';if (node.nexts[index] == null) return 0;node = node.nexts[index];}return node.end;}/*** 字典树查询以目标前缀的单词有多少个*/public int getPre(String word) {if(word ==null) return 0;char[] chars = word.toCharArray();TrieNode node = root;int index = 0;for (char c : chars) {index = c - 'a';if(node.nexts[index]==null)return 0;node = node.nexts[index];}return node.path;}
}

转载于:https://www.cnblogs.com/keeya/p/9729153.html

字典树(前缀树)-Java实现相关推荐

  1. Trie(字典树/前缀树)

    字典树/前缀树 Trie(发音类似 "try")或者说 前缀树(字典树) 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键.这一数据结构有相当多的应用情景,例如自动补完和 ...

  2. 字典数(前缀树)的实现

    [题目] 字典树又称为前缀树或者Trie树,是处理字符串常用的数据结构.假设组成所有单词的字符仅是'a'-'z',请实现字典树的结构,并包含以下四个主要的功能. void insert(String ...

  3. 前缀树介绍,定义,图文详解分析——Java/Kotlin双版本代码

    前缀树 前缀树,又称作字典树,用一个树状的数据结构储存字典中的所有单词. 列,一个包含can.cat.come.do.i.in.inn的前缀树如下图所示: 前缀树是一个多叉树,一个节点可能存在多个节点 ...

  4. 【前缀树】写一个敏感词过滤器

    1.什么是敏感词过滤 这其实是一个很常见的功能,随处可见以至于你可能都没关注过,基本上在有评论的地方都会有它的身影. 举例来说,你打游戏和别人对喷的时候,是不是一些脏话发不出去哈哈,这些词汇会用*** ...

  5. python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)...

    python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容: (1)利用python中的dict实现Trie: ( ...

  6. Trie(前缀树/字典树)及其应用

    from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...

  7. leetcode 676. Implement Magic Dictionary | 676. 实现一个魔法字典(DFS+Trie 前缀树)

    题目 https://leetcode.com/problems/implement-magic-dictionary/description/ 题解 题意理解 前缀树问题,大意是是让你在字典中找到是 ...

  8. java实现前缀树--过滤敏感词汇

    一.前缀树简单介绍 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它 ...

  9. 字典树(Trie/前缀树)

    目录 字典树的概念 字典树的逻辑 字典树的实现 易混点剖析 代码示例 字典树的概念 字典树(Trie)是一种空间换时间的数据结构,是一棵关于"字典"的树.主要用于统计.排序和保存大 ...

  10. 最优雅的数据结构之一——字典树Trie(Java)

    什么是Trie? 又称单词查找树: 又叫前缀树(prefix tree): Trie树,是一种树形结构,是一种哈希树的变种. 作用: 用以较快速地进行单词或前缀查询: 用于快速检索.统计,排序和保存大 ...

最新文章

  1. 过渡期间的测试:外包软件的测试标准(译)
  2. HDU - 7008 水题(打表)
  3. 全志A33-BootLoader的两个阶段:boot0和second boot
  4. An error was encountered while running(Domain=LaunchSerivcesError, Code=0)
  5. php的内置函数strrpos_php strrpos 字符串查找函数内部源码实现
  6. HtmlUnit初探
  7. 使用windows live writer连接CSDN和博客园博客
  8. AWS AI网络研讨会 webinar - Case 分享
  9. java删除指定文件后重新建立文件系统_java file 操作之创建、删除文件及文件夹...
  10. [Android] Windows 7下 Android studio 安装 Genymotion 来调试 Android 遇到的问题总结
  11. java获取微信公众号二维码
  12. 价格行为交易策略:锤子十字线,Fakey,内部日烛线
  13. Localize Folders and Reports
  14. [原创]获取还原某音弹幕(web版)
  15. LTE - RA preamble的选择与其发送所需prach资源的选择
  16. 指定Jboss的JDK
  17. 日期相隔月数计算MONTHS_BETWEEN
  18. LOB variable no longer valid after subsequent fetch
  19. FANUC数控系统类有哪些最新发表的毕业论文呢?
  20. 我的GO+语言初体验-Go+入门安装避坑手册

热门文章

  1. 软件开发行业,年轻与大龄程序员的生存现状
  2. Python 实战多元线性回归模型,附带原理+代码
  3. 基于htmlparser实现网页内容解析
  4. 禁止蒙层底部页面跟随滚动 1
  5. 关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)
  6. Jenkins 2.9.1 安装文档
  7. 100c之37:爱因斯坦问题
  8. vbs直接执行批处理,修改注册表
  9. 自定义leftBarButtonItem的button
  10. Openfiler之一:Openfiler的安装(转载)