抱歉更新晚了,看了几天三体,2333,我们继续数据结构之旅。

一.什么是Tire树?

Tire树有很多名字:字典树、单词查找树。 故名思意,它就是一本”字典“,当我们查找"word"单词时,先找到w开头的词汇,再继续往下找到o开头的词汇,依次类推。

特点:

  1)除去根节点外的所有节点都有一个字符

  2)兄弟节点的字母各不相同

  3)从根到某一字符经过的所有字符拼接成一个 ”单词“ 或者 ”单词前缀“

例如:

很显然,Trie是空间换时间的操作,通过字符串公共前缀降低查询开销。

二.Trie树的应用场景。

Trie树用于 前缀匹配 和 范围查找 ,这些在搜索引擎等中可以用到。

但是用来匹配字符串的话,虽然也可以但是太鸡肋了。

例子:查找10W个字符串中是否存在某些字符串。

  思路1: 用hash分区,相同Hash值的分区进行匹配

  思路2: 用trie树,稳定的复杂度

现实是:

  hash:几乎所有语言都有现成库

  trie:你自己手写不靠谱的算法,或用一些压根不流行的包

所以用hash是99%的工程师会用的方法。至于为什么Java或其他语言不在语言库中扩展Trie:

  1)计算机中的字符太多,ASCII中只有128,但是Unicode中有65536个

  2)如果字符串数目过大,或者匹配的位数过多,都会占用很大的空间存储Trie树,Trie树的大小真的很可怕,这种情况下几乎不能用

三.Trie树的例子。

从10W个长度不超过10的字母的单词中,对每个单词,记录它首次出现的位置。

package ds7.trie;

public class Trie {
/**
* Trie树的顶点
*/
static class Vertex{
int firstPlace = -1;
Vertex[] vertices = new Vertex[26];
} /**
* Trie树
*/
static class TrieTree{
Vertex root = new Vertex(); /**
* 向某个节点插入单词/单词片段
* @param vertex
* @param word
*/
public void insertWord(Vertex vertex , String word, int firstPlace){
if(word.length() < 1){
return;
}
char ch = word.charAt(0);
ch = Character.toUpperCase(ch);
Vertex node = vertex.vertices[ch - 65];
if(node == null){
Vertex v = new Vertex();
v.firstPlace = firstPlace;
vertex.vertices[ch - 65] = v;
} insertWord(vertex.vertices[ch - 65], word.substring(1), firstPlace);
} /**
* 查找第一次出现的位置
* @param word
* @return
*/
public int getFirstPlace(String word){
int result = -1;
Vertex current = root;
for(char ch : word.toCharArray()){
ch = Character.toUpperCase(ch);
Vertex tmp = current.vertices[ch - 65];
if(tmp == null){
return -1;
}else{
current = tmp;
continue;
}
}
result = current.firstPlace;
return result;
}
} public static void main(String[] args) {
String[] words = new String[]{
"haha","java","word","python","word","c","scala","word",
}; TrieTree trieTree = new TrieTree();
for(int i = 0; i < words.length; i++){
trieTree.insertWord(trieTree.root,words[i],i);
} System.out.println("单词`word`首次出现在:" + trieTree.getFirstPlace("word"));
}
}

result:

单词`word`首次出现在:2

[数据结构] 2.3 Trie树的更多相关文章

  1. 数据结构与算法—Trie树

    Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...

  2. [数据结构] P2.3 Trie树

    1.Trie树的概念 Trie树也叫做`字典树`或者`单词查找树`.用于字符串以及字符串元信息的快速查询. 例如:

  3. 可持久化数据结构(平衡树、trie树、线段树) 总结

    然而好像没有平衡树 还是题解包: T1:森林 树上主席树+启发式合并. 然而好像知道标签就没啥了.在启发式合并时可以顺手求lca 然而这题好像可以时间换空间(回收空间) T2:影魔 难点在于考虑贡献的 ...

  4. 数据结构《16》----自动补齐实现《一》----Trie 树

    1. 简述 Trie 树是一种高效的字符串查找的数据结构.可用于搜索引擎中词频统计,自动补齐等. 在一个Trie 树中插入.查找某个单词的时间复杂度是 O(len), len是单词的长度. 如果采用平 ...

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

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

  6. java实现的Trie树数据结构

    近期在学习的时候,常常看到使用Trie树数据结构来解决这个问题.比方" 有一个1G大小的一个文件.里面每一行是一个词.词的大小不超过16字节,内存大小限制是1M. 返回频数最高的100个词. ...

  7. 数据结构之Trie树

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

  8. 【数据结构】Trie树

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

  9. 数据结构与算法简记--Trie树

    Trie树 概念 多叉树,节点为字符串中的单个字符. Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起. 将多个字符串按字符拆分插入Trie树,用于字符串查找,关键词提示等 举 ...

随机推荐

  1. zabbix利用percona-toolkit工具监控Mysql主从同步状态

    一.下载percona-toolkit工具包 percona-toolkit是一组高级命令行工具的集合,可以查看当前服务的摘要信息,磁盘检测,分析慢查询日志,查找重复索引,实现表同步等等. [root ...

  2. Generative Adversarial Nets(GAN Tensorflow)

    Generative Adversarial Nets(简称GAN)是一种非常流行的神经网络. 它最初是由Ian Goodfellow等人在NIPS 2014论文中介绍的. 这篇论文引发了很多关于神经 ...

  3. java知识

    DiskFileUploadhttps://blog.csdn.net/FightingITPanda/article/details/79742631 import java.util.ArrayL ...

  4. bash: ipconfig: command not found

    问题描述: [root@localhost ~]# ipconfig-bash: ipconfig: command not found[root@localhost ~]# 解决方法一: cd /e ...

  5. postman—使用newman来执行postman脚本

    我们知道postman是基于javascript语言编写的,而导出的json格式的postman脚本也无法直接在服务器运行,它需要在newman中执行(可以把newman看做postman脚本的运行环 ...

  6. excel解决日常问题记录

    =MOD(ROW(),2)和=TEXT(B2487-B2486,"[h]:mm:ss"),我利用excel分析出了延迟的数据 比较2个字符串是否一样:=EXACT(A2,F2) 公 ...

  7. python2---输出1--100之间的偶数

    #!/usr/bin/env python方法1:num = 1while num <= 100: if num % 2 == 0: print(num) num += 1方法2: #!/usr ...

  8. Ubuntu ssh秘钥生成

    一,秘钥生成传送 ssh-keygen 选项: -b:指定密钥长度: -e:读取openssh的私钥或者公钥文件: -C:添加注释: -f:指定用来保存密钥的文件名: -i:读取未加密的ssh-v2兼 ...

  9. BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着 ...

  10. 将Emacs Org mode用于GTD任务管理

    在上一篇日志中,我简要介绍了如何围绕Emacs Org mode构建个人任务管理系统的基本思路与方法.因为Org mode体系庞大.功能繁杂,本文仅以提纲契领的方式介绍不同环节在Org mode中的操 ...