字典树-大量字符串前缀及出现次数是否存在统计(Trie树-java)算法实现

JAVA实现trie树(前缀树,字典树)进行敏感词检测/过滤 JAVA实现trie树(前缀树,字典树)进行敏感词检测/过滤 文章目录JAVA实现trie树(前缀树,字典树)进行敏感词检测/过滤定义优点:缺点:应用敏感词检测开始构建敏感词Trie树时间复杂度敏感词去重敏感词检测去特殊字符方法结束标识符JAVA实现完整代码初始化词库 定义 在计算机科学中,trie树,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而 阅读详情

原文:https://blog.youkuaiyun.com/chenleixing/article/details/44708533

有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。它的优势是,利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表还高,当数据足够庞大时,会发现她比传统的字符串统计要快很多。


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

       下边我将把我实现的代码和大家分享一下,代码几乎每行都有详细注释,大家一看就清除明了了,时间原因,就不再用多余的文字再追加详述了。

 

创建字典树

[java]  view plain  copy
  1. package Trie;  
  2.   
  3. import org.apache.commons.lang3.StringUtils;  
  4.   
  5. import com.google.common.base.CharMatcher;  
  6.   
  7. /** 
  8.  * 字典树类 
  9.  *  
  10.  * @author chenleixing 
  11.  */  
  12. public class Trie {  
  13.   
  14.     //各个节点的子树数目即字符串中的字符出现的最多种类  
  15.     private final int SIZE = 26;  
  16.     //除根节点外其他所有子节点的数目  
  17.     private int numNode;  
  18.     //树的深度即最长字符串的长度  
  19.     private int depth;  
  20.     //字典树的根  
  21.     private TrieNode root;  
  22.   
  23.     /** 
  24.      * 初始化字典树 
  25.      */  
  26.     public Trie() {  
  27.         this.numNode=0;  
  28.         this.depth=0;  
  29.         this.root = new TrieNode();  
  30.     }  
  31.   
  32.     /** 
  33.      * 字典树节点类,为私有内部类 
  34.      */  
  35.     private class TrieNode {  
  36.   
  37.         // 所有的儿子节点或者一级子节点  
  38.         private TrieNode[] son;  
  39.         // 有多少字符串经过或到达这个节点,即节点字符出现的次数  
  40.         private int numPass;  
  41.         // 有多少字符串通过这个节点并到此结束的数量  
  42.         private int numEnd;  
  43.         // 是否有结束节点  
  44.         private boolean isEnd;  
  45.         // 节点的值  
  46.         private char value;  
  47.   
  48.         /** 
  49.          * 初始化节点类 
  50.          */  
  51.         public TrieNode() {  
  52.             this.numPass=0;  
  53.             this.numEnd=0;  
  54.             this.son = new TrieNode[SIZE];  
  55.             this.isEnd = false;  
  56.         }  
  57.     }  

 

首先各种方法操作方法的字符串验证或非法判断

       一般字典树常用存储单词类字符串,当然也可以存储数字或者其他字符只是一个耗费内存较多的问题,不管怎么最好在操作方法之前做个验证和判断,以更加的提高操作效率,代码健壮性更强,如插入,查找是否存在等,如果字符串中存在“非法”的字符,那么可以直接返回false来结束操作。代码如下边所示:

[java]  view plain  copy
  1. /** 
  2.  * 对操作的字符串进行一个非法的判断,是否为字母构成的字符串 
  3.  */  
  4. private boolean isStrOfLetter(String str){  
  5.     //null或者空白字符串,则插入失败  
  6.     if (StringUtils.isBlank(str)){  
  7.         return false;  
  8.     }  
  9.     //如果字符串中有非字母字符,则插入失败  
  10.     if(!CharMatcher.JAVA_LETTER.matchesAllOf(str)){  
  11.         return false;  
  12.     }  
  13.     return true;  
  14. }  

       其中代码中我用到了common-lang工具包里的StringUtils工具类和Guava里的CharMatcher,当然大家可以用循环啊用正则表达式或者其他工具来实现相同的功能,这里就不再一一详述了,如果有想深入了解它们用法的话或jar包下载,可参考我的以下博文:commons-lang中常用方法,StringUtils方法全集介绍,JavaScript、Java正则表达式详解,打了兴奋剂的CharMatcher,Strings字符串判断工具。

 

字典树存储字符串方法实现

[java]  view plain  copy
  1. /** 
  2.  * 插入方法,插入字符串,不区分大小写 
  3.  */  
  4. public boolean insertStr(String str) {  
  5.     //插入的字符为非法字符,则插入失败  
  6.     if(!isStrOfLetter(str)){  
  7.         return false;  
  8.     }  
  9.     //插入字符串  
  10.     str=str.toLowerCase();//不区分大小写,转为小写  
  11.     char[] letters = str.toCharArray();//转成字符数组  
  12.     TrieNode node=this.root;//先从父节点开始  
  13.     for (char c:letters) {  
  14.         int pos = c - 'a';//得到应存son[]中的索引  
  15.         if (node.son[pos] == null) {//此字符不存在  
  16.             node.son[pos] = new TrieNode();  
  17.             node.son[pos].value = c;  
  18.             node.son[pos].numPass=1;  
  19.             this.numNode++;  
  20.         } else {//此字符已经存入  
  21.             node.son[pos].numPass++;  
  22.         }  
  23.         node = node.son[pos];//继续为下一下字符做准备  
  24.     }  
  25.     node.isEnd = true;//标记:有字符串到了此节点已结束  
  26.     node.numEnd++;//这个字符串重复次数  
  27.     if(letters.length>this.depth){//记录树的深度  
  28.         this.depth=letters.length;  
  29.     }  
  30.       
  31.     return true;//插入成功  
  32. }  


 

查找是否存以某前缀开头的字符串方法实现

[java]  view plain  copy
  1. /** 
  2.  * 在字典树中查找是否存在某字符串为前缀开头的字符串(包括前缀字符串本身),不区分大小写 
  3.  */  
  4. public boolean isContainPrefix(String str) {  
  5.     //查找的字符是否非法字符,则失败  
  6.     if(!isStrOfLetter(str)){  
  7.         return false;  
  8.     }  
  9.     //查找字符串  
  10.     str=str.toLowerCase();//不区分大小写,转为小写  
  11.     char[] letters = str.toCharArray();//转成字符数组  
  12.     TrieNode node=this.root;//先从父节点开始  
  13.     for (char c:letters) {  
  14.         int pos = c - 'a';//得到应存son[]中的索引  
  15.         if (node.son[pos] != null) {  
  16.             node=node.son[pos];//此字符存在继续查找下一个字符  
  17.         } else {//此字符不存在  
  18.             return false;  
  19.         }  
  20.     }  
  21.     return true;  
  22. }  


 

查找是否存在某字符串(不为前缀)方法实现

[java]  view plain  copy
  1. /** 
  2.  * 在字典树中查找是否存在某字符串(不为前缀),不区分大小写 
  3.  */  
  4. public boolean isContainStr(String str) {  
  5.     //查找的字符是否非法字符,则失败  
  6.     if(!isStrOfLetter(str)){  
  7.         return false;  
  8.     }  
  9.     //查找字符串  
  10.     str=str.toLowerCase();//不区分大小写,转为小写  
  11.     char[] letters = str.toCharArray();//转成字符数组  
  12.     TrieNode node=this.root;//先从父节点开始  
  13.     for (char c:letters) {  
  14.         int pos = c - 'a';//得到应存son[]中的索引  
  15.         if (node.son[pos] != null) {  
  16.             node=node.son[pos];//此字符存在继续查找下一个字符  
  17.         } else {//此字符不存在  
  18.             return false;  
  19.         }  
  20.     }  
  21.     return node.isEnd;  
  22. }  

 

统计以指定字符串为前缀的字符串数量方法实现

[java]  view plain  copy
  1. /** 
  2.  * 统计以指定字符串为前缀的字符串数量,不区分大小写 
  3.  */  
  4. public int countPrefix(String str) {  
  5.     //统计的字符是否非法字符,则返回0  
  6.     if(!isStrOfLetter(str)){  
  7.         return 0;  
  8.     }  
  9.     //查找字符串  
  10.     str=str.toLowerCase();//不区分大小写,转为小写  
  11.     char[] letters = str.toCharArray();//转成字符数组  
  12.     TrieNode node=this.root;//先从父节点开始  
  13.     for (char c:letters) {  
  14.         int pos = c - 'a';//得到应存son[]中的索引  
  15.         if (node.son[pos] == null) {  
  16.             return 0;//没有以此字符串为前缀开头  
  17.         } else {//此字符存在,继续遍历  
  18.             node=node.son[pos];  
  19.         }  
  20.     }  
  21.     return node.numPass;  
  22. }  


 

统计某字符串出现的次数方法实现

[java]  view plain  copy
  1. /** 
  2.  * 统计以指定字符串为前缀的字符串数量,不区分大小写 
  3.  */  
  4. public int countPrefix(String str) {  
  5.     //统计的字符是否非法字符,则返回0  
  6.     if(!isStrOfLetter(str)){  
  7.         return 0;  
  8.     }  
  9.     //查找字符串  
  10.     str=str.toLowerCase();//不区分大小写,转为小写  
  11.     char[] letters = str.toCharArray();//转成字符数组  
  12.     TrieNode node=this.root;//先从父节点开始  
  13.     for (char c:letters) {  
  14.         int pos = c - 'a';//得到应存son[]中的索引  
  15.         if (node.son[pos] == null) {  
  16.             return 0;//没有以此字符串为前缀开头  
  17.         } else {//此字符存在,继续遍历  
  18.             node=node.son[pos];  
  19.         }  
  20.     }  
  21.     return node.numPass;  
  22. }  


 

前序遍历字典树方法实现

[java]  view plain  copy
  1. /** 
  2.  * 统计以指定字符串为前缀的字符串数量,不区分大小写 
  3.  */  
  4. public int countPrefix(String str) {  
  5.     //统计的字符是否非法字符,则返回0  
  6.     if(!isStrOfLetter(str)){  
  7.         return 0;  
  8.     }  
  9.     //查找字符串  
  10.     str=str.toLowerCase();//不区分大小写,转为小写  
  11.     char[] letters = str.toCharArray();//转成字符数组  
  12.     TrieNode node=this.root;//先从父节点开始  
  13.     for (char c:letters) {  
  14.         int pos = c - 'a';//得到应存son[]中的索引  
  15.         if (node.son[pos] == null) {  
  16.             return 0;//没有以此字符串为前缀开头  
  17.         } else {//此字符存在,继续遍历  
  18.             node=node.son[pos];  
  19.         }  
  20.     }  
  21.     return node.numPass;  
  22. }  

       这里是通过递归打印出所有的节点的值,如果想存入一个List或者追加StringBuilder或者StringBuffer中,需要创建一个全局变量或者方法里创建然后以参数形式传到递归方法中,这里不再进行详述,因为字典树的主要用途不在这里,此方法一般不需要。

 

返回字典树的根节点

[java]  view plain  copy
  1. /** 
  2.  * 返回根节点,根节点不存值 
  3.  */  
  4. public TrieNode getRoot() {  
  5.     return this.root;  
  6. }  


 

返回字典树的深度

[java]  view plain  copy
  1. /** 
  2.  * 返回字典树的深度 
  3.  */  
  4. public int getDept() {  
  5.     return this.depth;  
  6. }  

 

返回字典树的所有子节点的数目

[java]  view plain  copy
  1. /** 
  2.  * 返回字典树的所有子节点的数目(不包含子节点) 
  3.  */  
  4. public int getNumNode() {  
  5.     return this.numNode;  
  6. }  

 

 

测试字典树的所有方法

[java]  view plain  copy
  1. package Trie;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. public class TrieTest {  
  6.       
  7.     /** 
  8.      * 测试字典树 
  9.      *  
  10.      * @author chenleixing 
  11.      */  
  12.     @Test  
  13.     public void testTrie(){  
  14.         //创建一个字典树(其实可以在创建时指定字典树各节点的大小,大小根据存入字符种类的数量)  
  15.         Trie trie=new Trie();  
  16.         //测试字符串(当然越庞大越能展现它的优势)  
  17.         String[] testStrs=new String[]{"chefsd","chen","hahi","ch","cxing","hahha","my","home"};  
  18.         for(String s:testStrs){//向字典树中存入字符串  
  19.             trie.insertStr(s);  
  20.         }  
  21.           
  22.         //测试是否包含指定前缀的字符串  
  23.         boolean isCont=trie.isContainPrefix("ch");  
  24.         System.out.println(isCont);//输出true  
  25.           
  26.         //测试包含指定前缀的字符串的数量  
  27.         int countPrefix=trie.countPrefix("ch");  
  28.         System.out.println(countPrefix);//输出3  
  29.           
  30.         //测试包含指定字符串的数量  
  31.         int countStr=trie.countStr("ch");  
  32.         System.out.println(countStr);//输出1  
  33.           
  34.         //测试包含指定前缀的字符串的数量  
  35.         int countPre=trie.countPrefix("chee");  
  36.         System.out.println(countPre);//输出0  
  37.           
  38.         //测试子节点的数量和树的深度  
  39.         int numNode=trie.getNumNode();//为22  
  40.         int dept=trie.getDept();//为6  
  41.         System.out.println("字典树子节点的数量:"+numNode+"  树的深度:"+dept);  
  42.     }  
  43. }  

 

测试结果

[java]  view plain  copy
  1. true  
  2. 3  
  3. 1  
  4. 0  
  5. 字典树子节点的数量:22  树的深度:6  


over了!

转载请注明—作者:Java我人生(陈磊兴)   原文出处:http://blog.youkuaiyun.com/chenleixing/article/details/44708533


磁栅尺的基本原理 一、磁栅尺简介 磁栅尺(Magnetic scale)是一种常见于工业自动化设备领域的线性位移测量方案,因为其耐用性强,对环境要求不高,逐渐替代了对环境要求苛刻的光学直线测量方案。 作为自动化设备领域里不多见的精密位移检测方案,磁栅尺使用广泛,尤其适用于检测行程长、测量精度要求高、工况复杂的大型机床。磁栅尺安装方便,抗干扰能力强,抗冲击性强,不易受到振动、粉尘、水垢、油污等影响,耐高温和耐低温性能也较为突出。 二、磁栅尺基本组成与原理 磁栅尺主要由两个部分组成,磁尺和读磁头。 磁尺 磁尺是磁栅尺 阅读详情

相关推荐

ZYNQ软件复位重启、程序跳转的实现方法(Multiboot)

目录一、增加FSBL的调试信息 一、增加FSBL的调试信息 启动过程的调试信息如下: Xilinx First Stage Boot Loader Release 2016.4 Jan 19 2020-10:35:00 Devcfg driver initialized Silicon Version 3.1 Boot mode is QSPI Single Flash Informat...

weixin_41922484的博客 2万+

hdu-3336 Count the string

传送门 题目描述 就是计算字符串中每一个前缀出现的次数,然后把这些次数给加起来就是答案,然后最后要把这个答案mod1007. eg:对于字符串abab 它的前缀是a,ab,aba,abab 它们分别出现的次数为2,2,1,1 所以答案就是6 输入描述 第一行给一个T,代表有t组数据 接下来T个数据,首先会有一个数字n(1<=n<=200000),代表是字符串的长度 然后是一个字符串 输...

I_AM_jm的博客 282

DBSCAN聚类算法——机器学习(理论+图解+python代码)

一、前言 二、DBSCAN聚类算法 三、参数选择 四、DBSCAN算法迭代可视化展示 五、常用的评估方法:轮廓系数 六、用Python实现DBSCAN聚类算法 一、前言 去年学聚类算法的R语言的时候,有层次聚类、系统聚类、K-means聚类、K中心聚类,最后呢,被DBSCAN聚类算法迷上了,为什么呢,首先它可以发现任何形状的簇,其次我认为它的理论也是比较简单易懂的。今年在python...

huacha__的博客 20万+

【HDU3336】Count the String(kmp--每个前缀出现的次数)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3336 题目: 求给定字符串每个前缀在整个字符串出现的次数之和 解题思路: 初始答案为n,每个前缀都出现一次。 字符串的下标从0开始存,next[0]=-1,当next[i]≠0且≠-1时,说明子串的某个前缀(也是整个字符串的前缀)和整个子串的某个后缀相同,即整个字符串的前缀重复出现了一...

Cassie_zkq的博客 1287

【车间调度】车间调度问题的分类

本系列为自己学习调度相关知识的记录,如有误请指出,也欢迎调度方向的小伙伴加我好友共同交流。 车间调度问题的分类 根据工件和车间构成不同,车间调度问题可分为以下几种 1.单机调度问题 在单机调度问题(S,SMP)中,加工系统只有一台机床,待加工的工件有且仅有一道工序,所有工件都在该机床上进行加工。此问题是最简单的调度问题,当生产车间出现瓶颈机床时的调度就可视为此调度问题。 ...

weixin_51656605的博客 7429

Flotherm XT学习历程

大家好,通过半年的热仿真软件学习使用,最终发现最好用,最好上手的软件就是Flotherm XT,对新手非常友好,但由于软件近几年才发布,网上教程非常少,后面我将在这里持续分析软件使用心得,和大家一起学习。

xiaoredred的博客 6255

Java 数据结构与算法中的字典树你学会了吗?

Trie 的历史字典树 Trie 这个词来自于 retrieval,于 1912 年,Axel Thue 首次抽象地描述了一组字符串数据结构的存放方式为 Trie 的想法。这个想法于 1960 年由 Edward Fredkin 独立描述,并创造了 Trie 一词。你看看,多少程序员为了一个词、方法名、属性名,想破脑袋!

AS011x的博客 491

从零构建机械臂规划栈:Pinocchio、OMPL与Ruckig的工程化融合实践

本文详细介绍了如何从零构建机械臂规划栈,通过融合Pinocchio、OMPL和Ruckig三大核心组件,实现高性能的机械臂运动规划与轨迹生成。文章深入探讨了技术选型、工程架构设计及实战优化技巧,特别针对逆解、路径规划和轨迹平滑等关键环节提供了实用解决方案,适用于工业场景中的高实时性需求。

weixin_29072299的博客 433

字典树(Trie/前缀树)

Trie 字典树 前缀树

good good study, day day up! 7866

【实战项目开发技术分享】ROS1.0、ROS 2.0和CyberRT开源通信框架对比

随着机器人和自动驾驶技术的飞速发展,开源通信框架在机器人、自动驾驶行业扮演着重要的角色。ROS1.0是一个广泛应用于机器人领域的开源框架,ROS 2.0是其改进版本,而CyberRT是Baidu Apollo自动驾驶平台的通信框架。ROS和ROS 2.0都注重灵活性和共享性,适用于各种机器人应用。CyberRT则专注于实时性和高性能,适用于自动驾驶等对实时性要求较高的场景。选择适合的框架取决于具体应用需求和开发者的偏好。

xiewf的博客 2万+

【FDTD】仿真目录(共计 16 篇)

对于完美吸收型边界条件,有时候我们需要设置将仿真结构穿过边界条件区域,具体原因可以阅读下文。在进行 S 参数扫描时,当考虑到材料的色散特性时,我们可以如下文一样选择计算群延迟。仿真,我们需要构建仿真结构与仿真区域,对于它们的尺寸,应该遵循下文进行设定。中存在多种不同的网格类型,具体可以参考下文,这部分内容仅作了解即可。尺寸的设置问题,对于 mesh 的最小尺寸,可以参考下文。的边界条件设置也十分重要,下文中我们对边界条件进行总结。仿真中我们可以设定参与仿真的模式数量,可以参考下文。尺寸的实例,详见下文。

u011699626的博客 502

Java字典树(Trie)数据结构

Java字典树(Trie)数据结构 数据结构计算机编程中的关键内容,了解什么时候使用以及为什么使用是非常重要的。本文介绍字典树(Trie,发音try)数据结构,理解其实现并分析其复杂度。 1. 字典树(Trie) 字典树不是很知名,一般课程中提及不多,但不代表其不重要。有时也称为基数树和前缀树(因为能根据前缀进行搜索),它是基于树的数据结构,节点存储的字符(通常为字符串中的字符),通过向下遍历树的...

neweastsun的专栏 3476

XCP实战系列介绍07-使用ASAP2 Editor生成A2l文件详解

介绍通过ASAP2 Editor工具生成A2l文件步骤详解

initiallizer的博客 7296

Trie前缀树(字典树)的java实现

前缀树结构(Trie)是一种比较特别的数据结构,用来存多个字符串,如果你想查找以某个前缀开头的字符串有几个?或者某个字符串出现了多少次?那么它就派上用场了。 思路:简单得说,我们用链表的底层来做这个前缀树,每个Node有3个属性, pass:经过这个节点的时候pass+1 end:当到达最后节点end+1 next:当前节点的下个节点,可能有多个,所以我们用HashMap<Integer,Node>来存储,key是ASCII码(节点值),value是下个节点对象。 每当我们存一个字符

ray890206的博客 627

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

字符串算法总结——字典树

字典树 好不容易不用学EXKMP,开森,实际上字典树很简单,我们看: 已知有 n 个长度不一定相同的母串,以及一个长度为 m 的模式串 T,求该模式串是否是其中一个母串的前缀。如果将模式串 T 挨个去比较,则算法复杂度会很高,达到 O(n×m),是否有高效的方法呢? 已知一个长度为 n 的字符串 S,求该字符串有多少个不相同的子串。朴素的做法,可以先枚举出所有的子串,这样时间复杂度为 O(n...

LiuKairui的博客 1715

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Trie树(字典树)

1. Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。 它有3个基本性质:

jiutianhe的专栏 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Trie树详解及其应用

一、知识简介         最近在看字符串算法了,其中字典树、AC自动机和后缀树的应用是最广泛的了,下面将会重点介绍下这几个算法的应用。       字典树(Trie)可以保存一些字符串->值的对应关系。基本上,它跟 Java 的 HashMap 功能相同,都是 key-value 映射,只不过 Trie 的 key 只能是字符串。   Trie 的强大之处就在于它的时间复杂度。它的插入和

Hackbuteer1的专栏 7万+

前缀树(字典树)总结-java版

目录 前缀树的概述 前缀树的应用场景 前缀树的java实现 节点 前缀树(增加,查询字符串数量,查询前缀数量) 测试 与DFA查询敏感词的类似与不同 类似 不同 前缀树的概述 前缀树又名字典树,单词查找树,Trie树,是一种多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构。 典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经...

今天吃了吗的博客 3081

Trie树(字典树&前缀树)

Trie树的学习 文章目录1. Trie树的基本知识2. Trie树的实现2.1 二维数组实现2.2 TrieNode实现2.3 方法对比2.4 问题分析 1. Trie树的基本知识 Trie 树(又叫「前缀树」或「字典树」)是一种用于快速查询「某个字符串/字符前缀」是否存在的数据结构。 Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。 Trie树是一种哈希树的变种。 典型应用:用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。 优点:最大限度

小朱小朱绝不认输的博客 2539

Java实现字典树 Trie

字典树又称为前缀树,是n叉树的特殊形式,广泛应用于统计和排序大量的字符串,它可以很大程度减少无所谓的字符比较,查询效率较高,Trie的核心思想是空间换时间,利用字符串的公共前缀提高查询效率

m0_62701287的博客 2061

Java:实现 trie字典树算法(附带源码)

Java:实现 trie字典树算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1565

Trie树的Java实现

第一部分、Trie树 1.1、什么是Trie树     Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。     Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到

sh_c1991的专栏 2230

科普文:算法和数据结构系列【高效的字符串检索结构:字典树Trie树原理、应用及其java示例代码解读】

今天我们再来看一种树型结构:字典树又名前缀树、单词查找树、Trie树,是哈希树的变种,是一种存储大量字符串的树形数据结构,相比于HashMap存储,在存储单词(和语种无关,任意语言都可以)的场景上,节省了大量的内存空间。‌注意事项‌:实现时需要考虑内存使用,避免浪费空间。 优化方向 节省空间:  压缩字典树,但是维护成本更高;  三分搜索树 压缩前缀树:合并只有一个子节点的节点,可以减少内存使用。 Ternary Search Tree:每个节点有三个子节点,可以在某些情况下提供更好的平衡。

为无为,事无事,味无味。 1187
上一篇: java数据结构与算法之栈(Stack)设计与实现
下一篇: 并查集(Java实现)
还不够
博客等级 码龄16年 113粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值