前缀树(Trie)原理及Java实现
前缀树的结构
Trie树,又叫字典树、前缀树(Prefix Tree)、单词查找树或键树,是一种多叉树结构。如下图:
上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。从上图可以归纳出Trie树的基本性质:
①根节点不包含字符,除根节点外的每一个子节点都包含一个字符。
②从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。
③每个节点的所有子节点包含的字符互不相同。
④从第一字符开始有连续重复的字符只占用一个节点,比如上面的to,和ten,中重复的单词t只占用了一个节点。
前缀树的应用
1、前缀匹配
2、字符串检索
3、词频统计
4、字符串排序
下面看看怎样使用前缀树来实现前缀匹配的。
前缀匹配
了解了前缀树的结构后,就可以利用前缀树的性质来解决现实中的问题。比如说查找一个字符串数组中是否含有前缀单词,什么是前缀单词:上面的 in,就是 inn 的前缀单词。如果有十几万条单词,并且每个单词的长度都是5-10以内,这样必定存在大量重复的字符,因此利用前缀树来求解不仅速度快而且空间复杂度也比较好。
①定义前缀树结构
class Tries{Boolean isTrie ;HashMap<Character, Tries> children=new HashMap<Character, Tries>();
}
上面的 isTrie 用来标记单词是否遍历完。children表示该节点的子节点。如上面的t节点的子节点有o和e两个。
②建立前缀树
public static boolean insertNode(String str,Tries head){if(str==null||str.length()==0)return false;//如果插入的单词为null 或者单词长度为0直接返回false,false代表该单词不是前缀树中某个单词的前缀,//或者前缀树中某个单词是该单词的前缀。char chs[]=str.toCharArray();int i=0;Tries cur=head;//将字符串的每个字符插入到前缀树中while(i<chs.length){ if(!cur.children.containsKey(chs[i])){cur.children.put(chs[i], new Tries());//如果当前节点中的子树节点中不包含当前字符,新建一个子节点。}//否则复用该节点cur=cur.children.get(chs[i]);if(cur.count==true){System.out.println(" trie tree");return true;//判断前缀树中是否有字符串为当前字符串的前缀。}i++;}cur.count=true;if(cur.children.size()>0){System.out.println(" trie tree");return true;//判断当前字符串是否是前缀树中某个字符的前缀。}return false;}
前缀树的建立过程就是插入字符串的过程,同时在插入节点的时候可以判断插入的字符串是否是前缀树里面某个单词的前缀,或者前缀树中的某个单词是否是该单词的前缀。
①先将字符串转换为字符数组,然后对每个字符进行处理,如果当前节点的子节点中包含有要处理的字符字节复用。否则新建一个子节点。
②判断是否是前缀单词的时候,有两个步骤,首先要看该字符串是否是其他字符串的前缀,还有看其他字符串是否是当前字符串的前缀。
判断前缀单词的完整代码:
public class isTrie {public static void main(String[] args) {Tries tries=new Tries();String strs[]={"abc","abd","b","abdc"};for(int i=0;i<strs.length;i++) insertNode(strs[i], tries); }
public static boolean insertNode(String str,Tries head){if(str==null||str.length()==0)return false;char chs[]=str.toCharArray();int i=0;Tries cur=head;while(i<chs.length){ if(!cur.children.containsKey(chs[i])){cur.children.put(chs[i], new Tries());}cur=cur.children.get(chs[i]);if(cur.count==true){System.out.println(" trie tree");return true;}i++;}cur.count=true;if(cur.children.size()>0){System.out.println(" trie tree");return true;}return false;}
}
class Tries{boolean isTrie;HashMap<Character, Tries> children=new HashMap<Character, Tries>();
}
前缀树(Trie)原理及Java实现相关推荐
- 【算法学习】前缀树Trie
Tire(前缀树) 一.定义: Trie(发音类似 "try")或者说前缀树是一种树形数据结构,用于高效地存储和检索字符串数据集中的键. 其核心是使用「边」来代表有无字符,使用「点 ...
- golang gin框架源码分析(二)---- 渐入佳境 摸索Engine ServeHTTP访问前缀树真正原理
文章目录 全系列总结博客链接 前引 golang gin框架源码分析(二)---- 渐入佳境 摸索Engine ServeHTTP访问前缀树真正远原理 1.再列示例代码 从示例代码入手 2.r.Run ...
- Java 实现 Trie (前缀树)
LeetCode:https://leetcode-cn.com/problems/implement-trie-prefix-tree/ 什么是前缀树 Trie(发音类似 "try&quo ...
- java实现前缀树--过滤敏感词汇
一.前缀树简单介绍 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它 ...
- python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)...
python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容: (1)利用python中的dict实现Trie: ( ...
- Trie(字典树/前缀树)
字典树/前缀树 Trie(发音类似 "try")或者说 前缀树(字典树) 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键.这一数据结构有相当多的应用情景,例如自动补完和 ...
- 208. 实现 Trie (前缀树)
208. 实现 Trie (前缀树) Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键.这一数据结构有相当多的应用情景,例 ...
- 字典树(Trie,前缀树)
目录 一,字典树 二,OJ实战 CSU 1115 最短的名字 HDU 1075 What Are You Talking About 力扣 1804. 实现 Trie (前缀树) II 力扣 139. ...
- SpringBoot使用前缀树过滤敏感词
前缀树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利 ...
- 算法与数据结构07:前缀树,计数排序与桶排序
算法与数据结构07:前缀树,计数排序与桶排序 前缀树 计数排序 桶排序 前缀树 Trie 1.根据字符串数组中,每个字符串的字符作为路径,组成而成的一个多叉树结构 2.每个节点都有一个paths数组, ...
最新文章
- linux下内存测试mbw,【转帖】MBW内存测试
- 软件配置文件如何读写
- “男儿有泪不轻弹”和“活着”
- [BZOJ 2424][HAOI2010]订货(费用流)
- freeradius的proxy功能
- java实用教程——组件及事件处理——ItemEvent事件(设置字体类型)
- C语言: ---gdb查看内存和寄存器内容
- Spring-context-ConfigurationClassUtils类
- uniapp ios时间戳获取不到_个人小程序uniapp实战开发(三):数据库设计与文章列表...
- windows下安装sqlmap 详细教程
- 机器学习-预测之BP神经网络模型原理及实战
- 怎么把好几行弄成一行_怎么在word文档里把很多行一下合并成一行
- 一个基于PyTorch实现的Glove词向量的实例
- [bzoj1787][Ahoi2008]Meet 紧急集合 倍增LCA
- 使用Quixel Bridge导入资源到UE4
- TI DaVinci(达芬奇)入门
- 5G阅读笔记1- Massive MIMO 波束管理
- Android kotlin Jetpack mvvm 项目,阿里+头条+腾讯大厂Android笔试真题
- python卡方检验kf_data_常用统计检验的Python实现
- 消息队列基本原理和选型对比