数据结构——Trie树

概念

Trie树,又称字典树、前缀树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

Trie树的结构如下图所示:

Trie树中的节点数据结构如下:

  • 当前字符
  • 子节点数组(如果全为小写字母的话,子节点数量固定为26个,根据字符来确定在数组中的位置,如'a'的下标为0,'z'为25)
  • 是否为一个单词的结尾(标红的节点)
  • 出现次数

特点:root节点不存储字符。

代码实现

  1. public class Trie {
  2. private Node root;
  3. class Node{
  4. int count;
  5. char ch;
  6. Node[] child;
  7. boolean isEnd;
  8. public Node() {
  9. this.count = 1;
  10. this.child = new Node[26];
  11. this.isEnd = false;
  12. }
  13. }
  14. /** Initialize your data structure here. */
  15. public Trie() {
  16. this.root = new Node();
  17. }
  18. /** Inserts a word into the trie. */
  19. public void insert(String word) {
  20. if (null == word || "".equals(word)) return;
  21. if (this.search(word)) return;
  22. Node cur = this.root;
  23. char[] chars = word.toCharArray();
  24. for(char c : chars) {
  25. //根据字符找到在子节点数组中的下标
  26. int pos = c - 'a';
  27. Node child = cur.child[pos];
  28. //如果子节点没有被初始化过则初始化,并设置其字符
  29. if (child == null) {
  30. cur.child[pos] = new Node();
  31. cur.child[pos].ch = c;
  32. }
  33. cur.count++;
  34. //更新cur节点为子节点,向下递归
  35. cur = cur.child[pos];
  36. }
  37. //最后一个字符的节点
  38. cur.isEnd = true;
  39. }
  40. /** Returns if the word is in the trie. */
  41. public boolean search(String word) {
  42. if (null == word || "".equals(word)) return true;
  43. Node cur = this.root;
  44. char[] chars = word.toCharArray();
  45. for (char c : chars) {
  46. int pos = c - 'a';
  47. Node node = cur.child[pos];
  48. if (node == null) return false;
  49. cur = node;
  50. }
  51. return cur.isEnd;
  52. }
  53. /** Returns if there is any word in the trie that starts with the given prefix. */
  54. public boolean startsWith(String prefix) {
  55. if (null == prefix || "".equals(prefix)) return true;
  56. Node cur = this.root;
  57. char[] chars = prefix.toCharArray();
  58. for (char c : chars) {
  59. int pos = c - 'a';
  60. Node node = cur.child[pos];
  61. if (node == null) return false;
  62. cur = node;
  63. }
  64. return cur.count > 0;
  65. }
  66. public static void main(String[] args) {
  67. Trie trie = new Trie();
  68. trie.insert("a");
  69. trie.insert("adc");
  70. trie.insert("aer");
  71. System.out.println(trie.search("a"));
  72. System.out.println(trie.startsWith("a"));
  73. }
  74. }

结果:

208. Implement Trie (Prefix Tree)

超过94%,感觉还不错~

【数据结构】Trie树的更多相关文章

  1. 数据结构~trie树(字典树)

    1.概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. 我理解字典树是看了这位大佬博客.还不了解字典树的 ...

  2. hiho149周 - 数据结构 trie树

    题目链接 坑点:accept和deny的ip可能相同,需加个判断 #include <cstdio> #include <cstdlib> #include <vecto ...

  3. 基于trie树的具有联想功能的文本编辑器

    之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...

  4. 讲解——Trie树(字典树)

          Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单 ...

  5. Trie树(转)

    原文http://www.cnblogs.com/TheRoadToTheGold/p/6290732.html 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看 ...

  6. 浅谈Trie树(字典树)

          Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单 ...

  7. [转] 浅谈Trie树(字典树)

    原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找 ...

  8. Trie树分词

    http://www.hankcs.com/program/java/tire-tree-participle.html 最近在看Ansj中文分词的源码,以前没有涉足过这个领域,所以需要做一些笔记. ...

  9. 查找(二)简单清晰的B树、Trie树具体解释

    查找(二) 散列表 散列表是普通数组概念的推广.因为对普通数组能够直接寻址,使得能在O(1)时间内訪问数组中的任何位置.在散列表中,不是直接把keyword作为数组的下标,而是依据keyword计算出 ...

随机推荐

  1. Linux高级编程--01.vi命令

    VI是Linux/Unix下标配的一个纯字符界面的文本编辑器.由于不支持鼠标功能,也没有图形界面,相关的操作都要通过键盘指令来完成,需要记忆大量命令.因此很多人不大喜欢它,但同时由于键盘的方式往往比鼠 ...

  2. JAVA多线程提高八:线程锁技术

    前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...

  3. java多线程机制1(线程创建的两种方式)

    进程:正在运行的程序.(即程序在内存中开辟了一片空间) 线程:是进程的执行单元. 一个进程至少包含了一个多个线程. 多线程是不是可以提高效率:多线程可以合理的利用系统的资源,提高效率是相对的.因为cp ...

  4. C# 实现java中 wiat/notify机制

    最近在学习java,看到wiat/notify机制实现线程通信,由于平时工作用的C#,赶紧用C#方式实现一个demo. Java 代码: import java.util.ArrayList; imp ...

  5. 教你Snapseed软件八个常用调图工具

    教你Snapseed软件八个常用调图工具 教你Snapseed(指划修图)软件八个常用调图工具 老阿·编写 Snapseed是目前手机摄影修图中功能最强大的一款软件,很多功能很像电脑用的Photosh ...

  6. Logitech K810 + Ubuntu

    The Logitech K810 is a nice keyboard, but it does not work with Ubuntu out of the box. Still contrar ...

  7. [linux]安装code::blocks

    1.安装基本编译环境 $sudo apt-get install build-essential $sudo apt-get install gdb 2.安装codeblock $sudo apt-g ...

  8. 【BZOJ】4872: [Shoi2017]分手是祝愿 期望DP

    [题意]给定n盏灯的01状态,操作第 i 盏灯会将所有编号为 i 的约数的灯取反.每次随机操作一盏灯直至当前状态能够在k步内全灭为止(然后直接灭),求期望步数.n,k<=10^5. [算法]期望 ...

  9. DOM基础操作

    本文地址:http://www.cnblogs.com/veinyin/p/7606972.html  1 访问 HTML 元素 常用方法 document.getElementById(" ...

  10. antdVG6随记

    g6是一个很棒的可视化工具 目前支持开发者搭建属于自己的图,图分析.图应用.图编辑器 图编辑器可以支持多种图例的创建 G6 是一个简单.易用.完备的图可视化引擎,它在高定制能力的基础上,提供了一系列设 ...