Trie的java实现

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

关注Trie 这种结构已经很久,Trie有一个很有趣的用途,那就是自动提示。而且,前不久在一次面试里,也需要用Trie来解答。所以,在此对这个数据结构进行总结。

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

它有3个基本性质:

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

下面这个图就是Trie的表示,每一条边表示一个字符,如果结束,就用星号表示。在这个Trie结构里,我们有下面字符串,比如do, dork, dorm等,但是Trie里没有ba, 也没有sen,因为在a, 和n结尾,没有结束符号(星号)。



有了这样一种数据结构,我们可以用它来保存一个字典,要查询改字典里是否有相应的词,是否非常的方便呢?我们也可以做智能提示,我们把用户已经搜索的词存在Trie里,每当用户输入一个词的时候,我们可以自动提示,比如当用户输入 ba, 我们会自动提示 bat 和 baii.

现在来讨论Trie的实现。

首先,我们定义一个Abstract Trie,Trie 里存放的是一个Node。这个类里有两个操作,一个是插入,另一个是查询。具体实现放在后面。

Node 类的实现

class Node {
    char content; // the character in the node
    boolean isEnd; // whether the end of the words
    int count;  // the number of words sharing this character
    LinkedList<Node> childList; // the child list
  
    public Node(char c){
        childList = new LinkedList<Node>();
        isEnd = false;
        content = c;
        count = 0;
    }
  
    public Node subNode(char c){
        if(childList != null){
	        for(Node eachChild : childList){
	            if(eachChild.content == c){
	                 return eachChild;
	            }
        	}
        }
        return null;
   }
}

 

现在我们来看这个Trie类的具体实现。

public class Trie{
    private Node root;
 
    public Trie(){
        root = new Node(' '); 
    }
 
    public void insert(String word){
    	if(search(word) == true) return;
    	
        Node current = root; 
        for(int i = 0; i < word.length(); i++){
            Node child = current.subNode(word.charAt(i));
            if(child != null){ 
                current = child;
            } else {
                 current.childList.add(new Node(word.charAt(i)));
                 current = current.subNode(word.charAt(i));
            }
            current.count++;
        } 
        // Set isEnd to indicate end of the word
        current.isEnd = true;
    }
    public boolean search(String word){
	    Node current = root;
        
	    for(int i = 0; i < word.length(); i++){    
            if(current.subNode(word.charAt(i)) == null)
                return false;
            else
                current = current.subNode(word.charAt(i));
        }
        /* 
        * This means that a string exists, but make sure its
        * a word by checking its 'isEnd' flag
        */
        if (current.isEnd == true) return true;
        else return false;
    }
    
    public void deleteWord(String word){
		if(search(word) == false) return;
	
		Node current = root;
		for(char c : word.toCharArray()) { 
			Node child = current.subNode(c);
			if(child.count == 1) {
				current.childList.remove(child);
				return;
			} else {
				child.count--;
				current = child;
			}
		}
		current.isEnd = false;
	}
    
	public static void main(String[] args) {
		Trie trie = new Trie();
		trie.insert("ball");
		trie.insert("balls");
		trie.insert("sense");
	
		// testing deletion
		System.out.println(trie.search("balls"));
		System.out.println(trie.search("ba"));
		trie.deleteWord("balls");
		System.out.println(trie.search("balls"));
		System.out.println(trie.search("ball"));
	}
}

时间复杂度分析:

对于insert, 如果被插入的String长度是 k, 每对一个字符进行查询,我们最多在child linkedlist里面查询26次(最多26个字母),所以,复杂度为O(26*k) = O(k). 对于 search, 复杂度是一样的。

【java】Trie树及Java实现 Trie树(字典树)的介绍及Java实现 我是在我们项目中发现有人使用这个字典树的,因为没有见过,所以来学习一下。Trie树,又称为前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。【这点很重要:位置决定】。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。如下是一棵典型的Trie树:Trie的来源是Retrieval,它常用于前缀匹配和词频统计。 阅读详情

相关推荐

trie4j:PATRICIA,双数组,LOUDS Trie Java实现

Trie4J-Java的各种trie实现。 Trie4J是各种trie实现的集合。 您可以使用Maven获取二进制文件: < dependency> < groupId>com.github.takawitter</ groupId> < artifactId>trie4j</ artifactId> < version>0.9.8</ version> </ dependency> 或从 即将发布:无计划。 2018/1/24: 发布。 2017/10/22: 发布。 2017/7/20: 发布。 2016/10/28: 发布。 2016/10/22: 发布。 2016年5月28日: 发布。 性能比较: 在颚木20120220-all-titles-in-ns0.gz中包含了127万个单词和1004万个字符。 在MacOS X

Trie树(字典树)

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

weixin_30629653的博客 692

UE5 AI寻路全攻略:从Nav Mesh基础到动态障碍与多模式导航

在游戏开发中,AI寻路是赋予非玩家角色自主移动能力的关键技术。其核心原理是通过预计算或实时生成一个表示可行走区域的导航网格,AI路径查找算法(如A*)在此网格上规划最优路径。这项技术的价值在于,它能极大提升游戏世界的真实感和交互性,使NPC能够智能地绕开障碍、穿越复杂地形,广泛应用于开放世界、RPG、策略游戏等多种场景。本文聚焦于虚幻引擎5的寻路系统,深入探讨其寻路网格体配置。针对动态环境挑战,文章详细介绍了如何利用寻路修饰体积和动态障碍物组件实现导航网格的实时更新;同时,针对游泳、飞行等特殊移动需求,解析

weixin_33226816的博客 360

【大数据管理】Java实现字典树TireTree

其次,从根节点到某一节点路径上经过的字符连接起来,为该节点对应的字符串;初始时当前结点cur为根结点,如果cur节点的子节点们不存在该字符,就直接将该子节点插入;如果是叶子节点,则一直往上搜索到被使用过的节点就停止搜索,因为从这个结点开始的所有结点都是为了索引要删除的这个单词,所以要把这些仅为了所以该单词的结点全部删除。如果要删除单词,先向下搜索到此字符串的最后一个子节点,如果字符串不存在则无需删除;指针指向这个单词的最后一个字符节点,如果这个节点还不是表示一个单词结尾,则把。)的思想,使用一个队列。

m0_53700832的博客 1718

STM32驱动电磁阀电路设计:从光耦选型到MOSFET驱动的实战解析

本文深入解析了STM32驱动24V电磁阀的完整电路设计,重点探讨了光耦选型与MOSFET驱动两大核心环节。针对电平转换与电气隔离需求,详细对比了EL357N与TLP2310等光耦在CTR、速度及耐压等关键参数上的差异与应用场景。同时,文章提供了MOSFET关键参数解读、驱动电路优化方案(如推挽驱动)以及完整的PCB布局、电源处理与调试避坑指南,旨在帮助工程师构建稳定可靠的工业控制电路。

weixin_29184371的博客 234

别再只跑memtester了!嵌入式Linux内存压力测试,这5个参数和场景你试过吗?

本文深入探讨了嵌入式Linux内存压力测试的高级技巧,重点解析了memtester工具的5个关键参数和实战场景。通过物理地址测试、迭代控制、内存分配策略等调优方法,帮助开发者有效检测内存稳定性问题,适用于长期运行设备、特定故障重现等复杂场景,提升嵌入式系统可靠性。

weixin_30838873的博客 424

Trie4J 使用教程

Trie4J 使用教程 1、项目介绍 Trie4J 是一个用于 Java 的多种 Trie 实现集合。它包括 PATRICIA、Double Array、LOUDS 等多种 Trie 实现。Trie4J 旨在提供高效的 Trie 数据结构,适用于各种字符串搜索和处理任务。 2、项目快速启动 安装 你可以通过 Maven 来获取 Trie4J 的二进制文件: <dependency> ...

gitblog_00980的博客 480

树莓派5安装ROS1避坑指南:从系统配置到cmake报错全解决

本文详细介绍了在树莓派5上安装ROS1的完整流程,包括系统配置、环境变量设置、cmake报错解决等关键步骤。针对树莓派5的ARM架构特性,提供了从基础安装到高级调试的系统级解决方案,帮助开发者高效部署ROS1并避免常见编译陷阱。特别针对cmake报错问题,给出了深度解析和实用修复方法。

spark7igniter的博客 233

Java实现字典树 Trie

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

m0_62701287的博客 2061

Fluent新手避坑:遇到‘Floating point exception’别慌,这7个排查步骤帮你搞定

本文为Fluent新手提供了遇到‘Floating point exception’错误时的7个详细排查步骤。从理解浮点异常的本质到边界条件检查、时间步长设置、求解器选择、网格优化、亚松弛因子调节以及高阶格式的取舍,帮助用户快速定位并解决问题,确保CFD仿真的稳定性和准确性。

weixin_30480075的博客 260

LeRobot 入门教程(一)软件环境、部署流程及摄像头配置

🤖 LeRobot:开源机器人学习平台 摘要:LeRobot是一个基于PyTorch的开源机器人学习平台,提供模型、数据集和工具,旨在降低机器人技术门槛。平台包含经过验证的模仿学习和强化学习方法,并提供预训练模型、人类演示数据集及模拟环境。安装需从源码获取,支持Python 3.10环境,可选扩展包括仿真环境(如gym-aloha)、电机控制(Dynamixel/Feetech SDK)和实验跟踪(Weights & Biases)。该平台托管在HuggingFace,并设有社区Discord频道

2506_90492529的博客 3417

【java】208. 实现 Trie (前缀树)---用封装集合快速实现!!!

Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: Trie() 初始化前缀树对象。 void insert(String word) 向前缀树中插入字符串 word 。 boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。 boolean startsWith(S

惠菁 587

YOLOv8轻量化模型瘦身术:深度解析与实战LAMP剪枝 YOLOv8(2021)

YOLOv8模型LAMP剪枝技术解析与实战 本文深入探讨了LAMP剪枝技术在YOLOv8目标检测模型中的应用。针对深度学习模型部署面临的资源限制问题,LAMP剪枝通过最小化L2失真和层自适应稀疏度分配,实现了高效模型压缩。相比传统幅度剪枝的"一刀切"方法,LAMP创新性地将剪枝建模为优化问题,定义LAMP分数来衡量权重重要性,自动确定各层最佳剪枝率。文章从理论基础出发,详细解析了LAMP的核心数学公式和算法流程,并提供了完整的YOLOv8移植实战指南,包括代码结构、剪枝步骤和微调策略。通

FJN110的博客 2422

trie java_Trie 树 及Java实现

Trie树的java代码 实现如下:import java.util.ArrayList;import java.util.Iterator;import java.util.List;/***//*** A word trie which can only deal with 26 alphabeta letters.* @author Leeclipse* @since 2007-11-21*...

weixin_29514317的博客 193

LVS 负载均衡面试题及参考答案

什么是 LVS 负载均衡?它的主要作用是什么? LVS(Linux Virtual Server)是一个基于 Linux 内核的开源负载均衡项目。它通过将请求流量按照一定的算法分发到后端的多个真实服务器(Real Server)上,从而实现负载均衡的功能。 从原理上来说,LVS 工作在网络层和传输层之间。当客户端发起请求时,请求首先到达 LVS 服务器,LVS 会根据预先设定的规则和算法,比如轮询(Round - Robin)、加权轮询(Weighted Round - Robin)、最少连

大模型大数据攻城狮的专栏 1469

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

trie java_Trie树的java实现

leetcode 地址:https://leetcode.com/problems/implement-trie-prefix-tree/description/难度:中等描述:略解题思路:Trie树 也就是字典查找树,是一种能够实现在一个字符串集中实现快速查找和匹配的多叉树结构,关于Trie树的深入分析我就不展开了,因为我自己也理解的不深刻^_^,这里只给出Trie树的定义,以及常用的应用场景,...

weixin_39531178的博客 149

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java实现Trie树

Java实现Trie树Java实现Trie树代码块代码块 import java.util.HashMap; public class Trie_Tree { private class Node{ private int dumpli_num;//该字符串的重复数目 private int prefix_num;//以该字符串为前缀的字串数

zailushangtch的博客 470

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java trie实现

java trie实现 http://www.riaos.com/ria/5814 posted on 2011-10-02 00:56lexus 阅读(.....

91

java中trie_在Java中实现Trie

我用Java实现了Trie数据结构,但是在运行代码时没有得到正确的答案 . 我用一些简单的字符串构建了trie . 我正在搜索单词和前缀,但结果不合适 . 我已经尝试了很多调试但仍然找不到它可能出错的地方 .Trie.java:public class Trie {public class Vertex {public int words;public int prefixes;public Ve...

weixin_42116585的博客 213

Trie树-Java实现

刷leetcode时候,经常碰见有使用Trie的,其意思就是字典树, 一组单词,inn, int, at, age, adv, ant, 我们可以得到下面的Trie: 当遇到一种问题,比如“ 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。” 该如何解决? 有一种方案就是使用Trie树加 排序实现。 以下

小猪猪and小马马的博客 447

Java 前缀树Trie的实现

Trie的基础实现:本实现只适用于英语这么语言,将单词存放在Character对象中,所以Trie才没有使用泛型。 使用泛型是比较好的设计: 不过这里的应用场景为英语单词,所以这里不采用泛型。这里将单词看成字符串是由一个个Character组成的。 1.向Trie添加元素(非递归写法) import java.util.TreeMap; public class Trie { ...

抛弃幻想,准备斗争 1187

Trie 树 及Java实现

来源于英文“retrieval”.   Trie树就是字符树,其核心思想就是空间换时间。 举个简单的例子。    给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,第一次出现第几个位置。 这题当然可以用hash来,但是我要介绍的是trie树。在某些方面它的用途更大。比如说对于某一个单词,我要询问它的前缀是否出现过。这样hash就不好搞了,而用tr

zhoujianghua_2008的专栏 533

Trie树java实现

Trie树又称前缀树或称字典树,是一个多叉树。可以实现前缀匹配查询或者字符串匹配查询。以下是java实现版 import java.util.TreeMap; /** * @Description Trie树(字典树/前缀树) * @Author steve * @Date */ public class TrieTree { /** * 根节点 */ private Node root; ...

远方的少年 561

trie java_Java实现简单的Trie

Trie,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符都不相同。下面这个...

weixin_31599065的博客 250

java实现的Trie树数据结构

近期在学习的时候,常常看到使用Trie树数据结构来解决这个问题。比方“有一个1G大小的一个文件。里面每一行是一个词。词的大小不超过16字节,内存大小限制是1M。返回频数最高的100个词。” 该怎样解决? 有一种方案就是使用Trie树加 排序实现 。 什么是Trie 树呢?也就是常说的字典树,网上对此讲得也非常多,简单补充一下个人理解: 它实际上相当于把单词的公共部分给拎出...

aofan9566的博客 162
上一篇: 如何避免大量重复URL被百度收录
下一篇: bitmap与2bitmap实现
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值