深入了解字典树

news2024/11/25 7:54:30

字典树(Trie)

目录

  • 字典树(Trie)
    • 一、问题引入
    • 二、字典树介绍
    • 3、字典树的实现
    • 4、存储与查询

一、问题引入

现有长度为n的字符串数组,[“go”,“goog”,“google”,“golang”,“baidu”,“leetCode”,“good”],给你一个字符串前缀如“go”,你需要从字符串中查找出所有以“go”为前缀的所有字符串
1、向数组中插入一个新的字符串
2、从字符串数组中查找出所有以“go”为前缀的字符字符串
的个数

插入

插入操作比较简单,我们知道数组长度为n,那么可以直接插入,时间复杂度为O(1)

查询

最简单并且最容易想到的方法就是暴力求解,那他的时间复杂度是多少? 字符串数组的长度为n,字符串前缀的长度为k,那我们需要遍历数组中每一个字符串,并且对这些字符串的前k个字符进行判断,那么暴力求解的时间复杂度就是O(kn)

那有没有更加快速的方法呢?

我们想一下,查询的这个操作是否跟我们查询字典的操作有些类似的,如果你要查找以“go”为前缀的单词,是不是需要先找到首字母“g”的部分?然后在查找第二个字母“o”,那我们能不能自己也建一部字典,实现上述的查询和插入问题呢?

二、字典树介绍

字典树,英文名 trie。顾名思义,就是一个像字典一样的树。

我们怎么用树来存储上述字符串数组呢?
在这里插入图片描述
可以发现,这棵字典树来代表字母,而从根结点到树上某一结点的路径就代表了一个字符串。举个例子,1->4->7->15 表示的就是字符串 good。

3、字典树的实现

如题中所述,数组中字符串由小写字母构成,因此我们可将将字典树看成一个26叉树(小写字母有26个)。假设数组中字符串的总长度为N,那么最坏情况下,字典树存在N+1个节点(根节点不存字符,最坏情况下数组中所有字符串没有相同的前缀,因此每个字符串都单独构成一条路径)
因此我们可以设一个二维数组son来存储Trie

son[N+10][26]

我们如何理解son中的元素呢?
对于son[x][y]

x:上方节点的编号
y:边上的值
son[x][y]:下方节点的编号
在这里插入图片描述
因为数组下标只能是整数,我们把a~z转化成0 ~ 26。

现规定从0开始对节点逐个编号,编号为0的节点是根节点(Trie为空时仅含根节点),同时 son 数组进行全0初始化。我们来看如何将字符c插入到Trie中。

如果 son[0][c] == 0 成立,说明Trie中不含字符c,此时应当令 son[0][c] = idx,其中 idx 为新建立的节点的编号。否则,c 已存在于Trie中,无需插入。

4、存储与查询

我们需要用son来存储Trie,还需要用idx来为每个节点编号,但是我们怎么知道存储的哪些字符串呢?
考虑上面所说的“goo”,“google”
在这里插入图片描述
我们需要一个数组cnt[]来存储以某个节点为结尾的字符串的个数,如果一个字符串的结尾节点标号为p,我们只需要cnt[p]++

此时,我们已经介绍了字典树需要的所有变量

static final int N = 100010;
static int[][] son = new int[N][26];
static int[] cnt = new int[N];
static int idx;	

存储一个字符串的实现如下:

//s代表所有存储的字符串,length代表s的长度
public static void insert(String s,int length)
    {
        char[] sc = s.toCharArray();
        int p = 0;
        for(int i = 0; i < length; i++)
        {
            int u = sc[i] - 'a';//将字符转换成序号
            if(son[p][u] == 0) son[p][u] = ++idx;//如果节点不存在则新建节点
            p = son[p][u];//如果节点存在则向下传递
        }
        cnt[p]++;//字符串遍历结束,将尾结点+1
    }

查询字符串与实现操作类似

public static int query(String s, int length)
    {
        char[] sc = s.toCharArray();
        int p = 0;
        for(int i = 0; i <length; i++)
        {
            int u = sc[i] - 'a';
            if(son[p][u] == 0) return 0;//如果节点不存在,返回0
            p = son[p][u];//如果节点存在,向下传递
        }
        return cnt[p];//返回结果
    }

这样,我们把存储和查询的时间复杂度都控制到了O(len(s)),s为字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构入门】-链表之双向循环链表

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【数据结构初阶&#xff08;C实现&#xff09;】 文章目录链表初始化打印链表尾插尾删新建一个节点头插头删查找在pos之前插入*删除pos位…

CSS中的伪元素和伪类

一直被伪类和伪元素所迷惑&#xff0c;以为是同一个属性名称&#xff0c;根据CSS动画&#xff0c;索性开始研究a:hover:after&#xff0c;a.hover:after的用法。 伪元素 是HTML中并不存在的元素&#xff0c;用于将特殊的效果添加到某些选择器。 对伪元素的描述 伪元素有两…

【Verilog】握手信号实现跨时钟域数据传输-handshake

文章目录handshake握手电路使用握手信号实现跨时钟域数据传输接口信号图题目描述解题思路代码设计数据发送模块data_driver数据接收模块data_receivertestbench波形handshake握手电路 跨时钟域处理是个很庞大并且在设计中很常出现的问题握手(handshake)是用来处理信号跨时钟域…

数字化引领乡村振兴,VR全景助力数字乡村建设

一、数字乡村建设加速经济发展随着数字化建设的推进&#xff0c;数字化农业产业正在成为农业产业发展的主导力量&#xff0c;因此数字化技术赋予农业产业竞争力的能力不可小觑。数字化乡村建设背景下&#xff0c;数字化信息技术将全面改造升级农村产业&#xff0c;从农业、养殖…

new set数组对象去重失败

我们知道Set是JS的一个种新的数据结构&#xff0c;和数组类似&#xff0c;和数组不同的是它可以去重&#xff0c;比如存入两个1或两个"123"&#xff0c;只有1条数据会存入成功&#xff0c;但有个特殊情况&#xff0c;如果添加到set的值是引用类型&#xff0c;比如数组…

DataGear 4.5.1 发布,数据可视化分析平台

DataGear 4.5.1 发布&#xff0c;严重 BUG 修复&#xff0c;具体更新内容如下&#xff1a; 修复&#xff1a;修复SQL数据集对于DB2、SQLite等数据源预览时会报错的BUG&#xff1b;修复&#xff1a;修复系统对于MySQL、MariaDB等数据源中无符号数值类型有时报错的BUG&#xff1…

借助媛如意让ROS机器人turtlesim画出美丽的曲线-云课版本

首先安装并打开猿如意其次打开蓝桥云课ROS并加入课程在猿如意输入问题得到答案在蓝桥云课ROS验证如何通过turtlesim入门ROS机器人您可以通过以下步骤入门ROS机器人&#xff1a;安装ROS&#xff1a;您需要安装ROS&#xff0c;可以在ROS官网上找到安装指南。安装turtlesim&#x…

英文拼写检查:TX Spell .NET for .NET 10.0 Crack

用于 Windows 窗体应用程序的 TX Text Control .NET 的强大拼写检查和语言工具。 表现 可靠准确的拼写检查 使用 TX Spell .NET for Windows Forms&#xff0c;您可以为基于 TX Text Control 的应用程序添加极其快速、高度可靠和非常准确的拼写检查。将 TX Spell .NET for Wind…

mysql中的共享锁,排他锁,间隙锁,意向锁及死锁机制

一、前言&#xff08;以下均为读完 高性能Mysql第四版 后的个人理解&#xff0c;建议阅读&#xff0c;挺不错的&#xff09;在写锁机制前先简单贴出mysql InnoDB引擎中的事务特性与隔离级别&#xff1a;事务的ACID标准(1)原子性-atomicity&#xff1a;一个事务作为一个不可分割…

vue中使用富文本Tinymce

本文是直接引用vue-element-admin中的&#xff0c;在此记录方便下次使用&#xff0c;日后再详细注释。 再src下的components下创建Tinymce 下包含以下文件 index.vue是主体文件 plugins.js 是 插件配置 toolbar.js 是 粗体、斜体等配置 EditorImage.vue 是右上角的上传 封装后…

一文速学-GBDT模型算法原理以及实现+Python项目实战

目录 前言 一、GBDT算法概述 1.决策树 2.Boosting 3.梯度提升 使用梯度上升找到最佳参数 二、GBDT算法原理 1.计算原理 2.预测原理 三、实例算法实现 1.模型训练阶段 1&#xff09;初始化弱学习器 2&#xff09;对于建立M棵分类回归树​&#xff1a; 四、Python实现 …

Spring_让Spring 依赖注入彻底废掉

在Spring之基于注解方式实例化BeanDefinition&#xff08;1&#xff09;_chen_yao_kerr的博客-CSDN博客中&#xff0c;我们在末尾处分享了一个甜点&#xff0c;就是关于实现了BeanDefinitionRegistryPostProcessor也可以实例化bean的操作&#xff0c;首先需要去了解一下那篇博客…

宝塔(二):升级JDK版本

目录 背景 一、下载JDK17 二、配置环境变量 三、配置新的JDK路径 背景 宝塔的软件商店只有JDK8&#xff0c;不满足我当前项目所需的JDK版本&#xff0c;因此想对JDK版本进行升级&#xff0c;升级为JDK17。 一、下载JDK17 先进入 /usr/lib/jvm 目录 点击终端&#xff0c;进…

OpenCV——line、circle、rectangle、ellipse、polylines函数的使用和绘制文本putText函数以及绘制中文的方法。

学习OpenCV的过程中&#xff0c;画图是不可避免的&#xff0c;本篇文章旨在介绍OpenCV中与画图相关的基础函数。 1、画线条——line()函数 介绍&#xff1a; cv2.line(image, start_point, end_point, color, thickness)参数&#xff1a; image: 图像start_point&#xff1a…

拉链表(小记)

拉链表创建外部表将编写的orders.txt上传到hdfs创建一个增减分区表将orders表的数据传入ods_orders_inc查看分区创建历史表插入数据操作创建外部表 create database lalian; use lalian;create external table orders(orderId int,createDate string,modifiedTime string,stat…

Redis集群方案应该怎么做?

今天我们来跟大家唠一唠JAVA核心技术-RedisRedis是一款流行的内存数据库&#xff0c;适用于高性能的数据缓存和实时数据处理。当需要处理大量数据时&#xff0c;可以使用Redis集群来提高性能和可用性。Redis在单节点模式下&#xff0c;虽然可以支持高并发、快速读写、丰富的数据…

sizeof与一维数组和二维数组

&#x1f355;博客主页&#xff1a;️自信不孤单 &#x1f36c;文章专栏&#xff1a;C语言 &#x1f35a;代码仓库&#xff1a;破浪晓梦 &#x1f36d;欢迎关注&#xff1a;欢迎大家点赞收藏关注 sizeof与一维数组和二维数组 文章目录sizeof与一维数组和二维数组前言1. sizeof与…

专业版即将支持自定义场景测试

物联网 MQTT 测试云服务 XMeter Cloud 专业版于 2022 年底上线后&#xff0c;已有不少用户试用&#xff0c;对数千甚至上万规模的 MQTT 并发连接和消息吞吐场景进行测试。同时我们也收到了希望支持更多物联网协议测试的需求反馈。 新年伊始&#xff0c;XMeter 团队全力聚焦于 …

搭建Gerrit环境Ubuntu

搭建Gerrit环境 1.安装apache sudo apt-get install apache2 注意:To run Gerrit behind an Apache server using mod_proxy, enable the necessary Apache2 modules: 执行:sudo a2enmod proxy_http 执行:sudo a2enmod ssl 使新的配置生效&#xff0c;需要执行如下命令:serv…

ctfshow【菜狗杯】wp

文章目录webweb签到web2 c0me_t0_s1gn我的眼里只有$抽老婆一言既出驷马难追TapTapTapWebshell化零为整无一幸免无一幸免_FIXED传说之下&#xff08;雾&#xff09;算力超群算力升级easyPytHon_P遍地飘零茶歇区小舔田&#xff1f;LSB探姬Is_Not_Obfuscateweb web签到 <?ph…