数据结构——Trie树

概念

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

Trie树的结构如下图所示:

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

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

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

代码实现

public class Trie {
private Node root;
class Node{
int count;
char ch;
Node[] child;
boolean isEnd; public Node() {
this.count = 1;
this.child = new Node[26];
this.isEnd = false;
}
} /** Initialize your data structure here. */
public Trie() {
this.root = new Node();
} /** Inserts a word into the trie. */
public void insert(String word) {
if (null == word || "".equals(word)) return;
if (this.search(word)) return; Node cur = this.root;
char[] chars = word.toCharArray();
for(char c : chars) {
//根据字符找到在子节点数组中的下标
int pos = c - 'a';
Node child = cur.child[pos];
//如果子节点没有被初始化过则初始化,并设置其字符
if (child == null) {
cur.child[pos] = new Node();
cur.child[pos].ch = c;
}
cur.count++;
//更新cur节点为子节点,向下递归
cur = cur.child[pos];
} //最后一个字符的节点
cur.isEnd = true;
} /** Returns if the word is in the trie. */
public boolean search(String word) {
if (null == word || "".equals(word)) return true;
Node cur = this.root;
char[] chars = word.toCharArray();
for (char c : chars) {
int pos = c - 'a'; Node node = cur.child[pos];
if (node == null) return false; cur = node;
}
return cur.isEnd;
} /** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
if (null == prefix || "".equals(prefix)) return true;
Node cur = this.root;
char[] chars = prefix.toCharArray();
for (char c : chars) {
int pos = c - 'a';
Node node = cur.child[pos];
if (node == null) return false;
cur = node;
} return cur.count > 0;
} public static void main(String[] args) {
Trie trie = new Trie(); trie.insert("a");
trie.insert("adc");
trie.insert("aer"); System.out.println(trie.search("a"));
System.out.println(trie.startsWith("a"));
}
}

结果:

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. BZOJ 2083 vector的巧用+二分

    2083: [Poi2010]Intelligence test Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 469  Solved: 227[Su ...

  2. Python进行数据分析(一)初步学习 对时区进行计数

    time_zones[:10] Out[19]: [u'America/New_York', u'America/Denver', u'America/New_York', u'America/Sao ...

  3. Counting Pair

    Counting Pair Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 112 Tried: 1209 Submit Status Best ...

  4. 用英文写Email的注意事项

  5. Redis-1-Redis的安装

    Redis 什么是Redis? redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库. 安装Redis: windows下如何安装? 官方网址:ht ...

  6. 【BZOJ】3036: 绿豆蛙的归宿

    [题意]给定DAG带边权连通图,保证所有点都能到达终点n,每个点等概率沿边走,求起点1到终点n的期望长度.n<=10^5. [算法]期望DP [题解]f[i]表示到终点n的期望长度. f[n]= ...

  7. 【NOIP】普及组2009 细胞分裂

    [算法]数论 [题解]均分的本质是A整除B,A整除B等价于A的质因数是B的子集. 1.将m1分解质因数,即m1=p1^a1*p2^a2*...*pk^ak 所以M=m1^m2=p1^(a1*m2)*p ...

  8. c++树,知道前序和中序求后序遍历

    经常有面试题就是知道一棵树的前序遍历和中序遍历让你写出后序遍历,这个慢慢画是能画出来的,但是要很快的弄出来还是要懂原理. 首先说一下三种遍历:所谓的前序后序和中序都是遍历时遍历根节点的顺序.子树的话依 ...

  9. 【leetcode 简单】第三十七题 相交链表

    编写一个程序,找到两个单链表相交的起始节点. 例如,下面的两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交. 注意: 如果两个 ...

  10. 【文件上传】jquery之ajaxfileupload异步上传插件

    来自:http://www.blogjava.net/sxyx2008/archive/2010/11/02/336826.html 由于项目需求,在处理文件上传时需要使用到文件的异步上传.这里使用J ...