一、什么是Trie?

Trie树,一般被称为字典树、前缀树等等,Trie是一种多叉树,这个和二分搜索树、堆、线段树这些数据结构不一样,因为这些都是二叉树。,Trie树除了是一种多叉树,它是一种哈希树的变种。因此Trie典型作用,是应用于统计和排序大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

Trie查询每个条目的时间复杂度和字典中一共有多少条目无关,其时间复杂度为O(w),这里的w乃是查询字单词的长度,二大多数单词的长度是小于10的。因此Trie核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

对于Trie二样,它有3个基本性质:
  1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
  3. 每个节点的所有子节点包含的字符都不相同。

二、Trie的构建

1.Trie的创建

package com.zfy.trie;

import java.util.TreeMap;

/*
* 这里的Trie是基于java的内部类TreeMap
* */
public class Trie { private class Node { //用来描述当我梦幻访问到当前的Node时,是否就已经找到了一个单词
public boolean isWord;
//对于每一个节点要有向下一个节点的映射,因为Trie对于每一个节点向下指向多少个节点是不定的,所以这样的映射是从Character一直到Node这样的一个映射,这里设计为Character,但这仅仅是一种假设,因为这里仅仅是限制于英文的数据类型
public TreeMap<Character, Node> next; public Node(boolean isWord){
this.isWord = isWord;
next = new TreeMap<>();
} public Node(){
this(false);
}
} private Node root;//Trie的根节点
private int size;//Trie中的档次数量 //Trie的构造函数
public Trie(){
root = new Node();
size = 0;
} //获得Trie中存储的单词数量
public int getSize(){
return size;
} }

2.向Trie中添加数据

// 向Trie中添加一个新的单词word
public void add(String word) { Node cur = root;
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
// 检查cur是否已经有指向c这个字符相应的节点,如果没有才会新创建一个节点
if (cur.next.get(c) == null) {
cur.next.put(c, new Node());
}
cur = cur.next.get(c);
} // 判断cur是否已经在Trie中了,如果不在,才设置isWord为true
if (!cur.isWord) {
cur.isWord = true;
size++;
}
}

3.Trie字典树的查询和前缀查询

// 查询单词word是否在Trie中
public boolean contains(String word) { Node cur = root;
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if (cur.next.get(c) == null) {
return false;
}
cur = cur.next.get(c);
}
return cur.isWord;
} // 查询是否在Trie中有单词以prefix为前缀
public boolean isPrefix(String prefix) { Node cur = root;
for (int i = 0; i < prefix.length(); i++) {
char c = prefix.charAt(i);
if (cur.next.get(c) == null)
return false;
cur = cur.next.get(c);
} return true;
}

4.完整代码

package com.zfy.trie;

import java.util.TreeMap;

/*
* 这里的Trie是基于java的内部类TreeMap
* */
public class Trie { private class Node { // 用来描述当我梦幻访问到当前的Node时,是否就已经找到了一个单词
public boolean isWord;
// 对于每一个节点要有向下一个节点的映射,因为Trie对于每一个节点向下指向多少个节点是不定的,所以这样的映射是从Character一直到Node这样的一个映射,这里设计为Character,但这仅仅是一种假设,因为这里仅仅是限制于英文的数据类型
public TreeMap<Character, Node> next; public Node(boolean isWord) {
this.isWord = isWord;
next = new TreeMap<>();
} public Node() {
this(false);
}
} private Node root;// Trie的根节点
private int size;// Trie中的档次数量 // Trie的构造函数
public Trie() {
root = new Node();
size = 0;
} // 获得Trie中存储的单词数量
public int getSize() {
return size;
} // 向Trie中添加一个新的单词word
public void add(String word) { Node cur = root;
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
// 检查cur是否已经有指向c这个字符相应的节点,如果没有才会新创建一个节点
if (cur.next.get(c) == null) {
cur.next.put(c, new Node());
}
cur = cur.next.get(c);
} // 判断cur是否已经在Trie中了,如果不在,才设置isWord为true
if (!cur.isWord) {
cur.isWord = true;
size++;
}
} // 查询单词word是否在Trie中
public boolean contains(String word) { Node cur = root;
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if (cur.next.get(c) == null) {
return false;
}
cur = cur.next.get(c);
}
return cur.isWord;
} // 查询是否在Trie中有单词以prefix为前缀
public boolean isPrefix(String prefix) { Node cur = root;
for (int i = 0; i < prefix.length(); i++) {
char c = prefix.charAt(i);
if (cur.next.get(c) == null)
return false;
cur = cur.next.get(c);
} return true;
}
}

结束语:合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。

参考:bobobo老师的玩转数据结构

版权声明:尊重博主原创文章,转载请注明出处 https://www.cnblogs.com/hsdy

数据结构08——Trie的更多相关文章

  1. [转]数据结构之Trie树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...

  2. 数据结构之Trie树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...

  3. 【数据结构】Trie树

    数据结构--Trie树 概念 Trie树,又称字典树.前缀树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计 ...

  4. 数据结构(trie,启发式合并):HDU 5841 Alice and Bob

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABJEAAAE6CAIAAAApz1RvAAAgAElEQVR4nO3d3css1b3g8fyTdbHJbD

  5. 用js来实现那些数据结构08(链表02-双向链表)

    其实无论在任何语言中,一种数据结构往往会有很多的延伸和变种以应对不同场景的需要.其实前面我们所学过的栈和队列也是可以用链表来实现的.有兴趣的小伙伴可以自己尝试着去实现以下. 有点跑题了...,我们还是 ...

  6. 【经典数据结构】Trie

    在计算机科学中,trie,又称前缀树或字典树,是一种有种树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前 ...

  7. java数据结构-08队列

    一.什么是队列 队列是一种特殊的线性表,只能在头尾两端进行操作,特点是先进先出:就像排队买票一样,先来的先买 二.接口设计  三.代码实现 可以使用动态数组.链表等实现:这里两种实现栈与双向链表 1. ...

  8. 数据结构《17》---- 自动补齐之《二》----Ternary Search Tree

    一. 序言 上一篇文章中,给出了 trie 树的一个实现.可以看到,trie 树有一个巨大的弊病,内存占用过大. 本文给出另一种数据结构来解决上述问题---- Ternary Search Tree ...

  9. 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

    涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...

随机推荐

  1. maven(16)-灵活的环境构建

     多个环境 一个项目,在家的时候可能会在本机上运行,在公司可能在内网测试环境运行,上线后会在生产环境运行,在不同的环境中会有一些配置是不一样的,至少数据库就不一样.如果每换一个环境就去改所有配置太 ...

  2. Gitlab installtation

    环境:Centos7 安装配置(安装开启http和sshd): 1 yum -y install curl openssh-server postfix 2 systemctl enable sshd ...

  3. Linux常用命令(二)————压缩+解压

    tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...

  4. escape,encodeURI,encodeURIComponent, URLEncode, RawURLEncode, HTMLEntity, AddSlash, JSON Encode

    online tooling: http://www.the-art-of-web.com/javascript/escape/ input : {user:{id:59,innerhtml:&quo ...

  5. C# 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    C# 在调用C++dll时,可能会出现 :试图加载格式不正确的程序. (异常来自 HRESULT:0x8007000B)这个错误. 一般情况下是C#目标平台跟C++dll不兼容,64位跟32位兼容性问 ...

  6. 一、C#简单读写

    using System.IO; static string configFileName = "config.json"; //不存在就直接新建文件夹 public static ...

  7. EF学习之CodeFirst(一)--创建Model

    一.创建Model 创建Model类有两种方式: 1.直接创建model 所有约束条件都以特性的方式写在model的属性上面,映射到数据库的table表名标识在class上,例如: [Table(&q ...

  8. 计算机作业(HTML简单框架网页制作) 物联网 王罗红

  9. Jquery 获取Checkbox值,prop 和 attr 函数区别

    总结: 版本 1.6 1.6 1.4 1.4 函数 勾选 取消勾选 勾选 取消勾选 attr('checked') checked undefined true false .prop('checke ...

  10. python 反转字符串 [::-1]的问题

    >>> a = '12345' >>> a[:-1]'1234' -1表示最后一个,所以取第一个到最后且不包含最后一个 >>> a[1:4:2]' ...