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

UNITY3D万人同屏,Dots万人同屏解决方案_类萌宠宠之战

UNITY3D弹幕游戏开发,万人同屏解决方案

6471

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

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

m0_53700832的博客 1718

(一)PyBullet机器人仿真入门:从环境搭建到实例解析

本文详细介绍了PyBullet机器人仿真平台从零开始的完整入门指南。内容涵盖环境搭建、官方示例解析、核心操作(连接、世界与模型)、关节控制与状态读取,以及碰撞检测、传感器模拟等高级功能,帮助读者快速掌握这一强大的机器人仿真工具。

weixin_29062865的博客 1379

皮肤病识别 - 使用DenseNet或EfficientNet模型在ISIC数据集上进行皮肤病识别任务

在本篇博客中,我们探讨了如何使用 DenseNet 和 EfficientNet 模型在 ISIC 数据集上进行皮肤病识别任务。我们加载了数据集,并进行了预处理。然后我们使用 Keras 构建了两个不同的模型,并训练和评估了它们。最后,我们使用训练好的模型对新的皮肤病图像进行了预测。

斌擎科技 1304

Trie4J 使用教程

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

gitblog_00980的博客 480

鲁棒控制理论 --- H∞ 控制(被裁篇)

鲁棒控制理论 --- H∞ 控制

记录老板的每次pua,分享领导每天的毒鸡汤... 6万+

Java实现字典树 Trie

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

m0_62701287的博客 2061

人工智能机器学习基础篇】——深入详解强化学习 基础知识,理解马尔可夫决策过程(MDP)、策略、价值函数等关键概念

人工智能机器学习基础篇】——深入详解强化学习 基础知识,理解马尔可夫决策过程(MDP)、策略、价值函数等关键概念

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1925

duilib 之 事件--bubbled冒泡事件应用、通用点击事件、进入离开事件、XML样式中直接添加事件

1. box 绑定点击事件 ui::Box *pSmallVideoBox = (ui::Box*)FindControl(L"rightBox"); if (pSmallVideoBox) { auto SwitchVideo = [this](ui::EventArgs* param){ m_bSecScreenIsScale = m_bMainScre...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 972

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

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

惠菁 587

基于YOLOv8的违规抽烟/打电话检测系统:从数据集构建到部署实战

模型优点缺点精度高速度慢(5 FPS)SSD速度快小目标检测差YOLOv5平衡性好官方支持停止YOLOv8最新、最快、最准需要PyTorch环境YOLOv8相比前代:骨干网络升级(C2f模块)无锚框检测(Anchor-Free)动态任务对齐分配(TaskAlignedAssigner)支持分类/检测/分割/姿态估计。

YOLO 98

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

12、每日卫星任务规划问题的不同公式

本文探讨了卫星任务规划问题的多种数学公式表示方法,包括传统的整数线性规划(ILP)模型、改进的基于路径的公式、基于集合覆盖的公式以及动态规划公式。通过案例研究比较了不同公式的求解效率和适用场景,并提供了使用Python进行实际求解的操作步骤。最后讨论了进一步优化策略及未来研究方向,旨在为解决卫星任务规划问题提供全面的理论支持和实践指导。

assembly8low的博客 203

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

trie java_Trie树的java实现

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

weixin_39531178的博客 149

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

假人有限元模型

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

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、付费专栏及课程。

余额充值