【数据结构】前缀树/字典树

news2024/11/30 0:34:35

目录

  • 1.概述
  • 2.代码实现
  • 3.应用

本文参考:
LeetCode 208.实现 Trie (前缀树)

1.概述

前缀树又称字典树、Trie 树、单词查找树,是一棵有根树,同时也是一种哈希树的变种,其每个节点包含以下字段:

  • 指向子节点的指针数组 children。一般来说,数组长度为 26,即小写英文字母的数量(也可根据实际情况自行设置)。此时 children[0] 对应小写字母 a,children[1] 对应小写字母 b,…,children[25] 对应小写字母 z。
  • 布尔字段 isEnd,表示该节点是否为字符串的结尾

2.代码实现

(1)Trie 树的代码实现如下:

class Trie {
    private Trie[] children;
    private boolean isEnd;
    
    //构造函数
    public Trie() {
        //每个节点最多有 26 个子节点,分别对应 26 个小写英文字母
        children = new Trie[26];
        isEnd = false;
    }
    
    //插入字符串
    public void insert(String word) {
        Trie node = this;
        for (int i = 0; i < word.length(); i++) {
            char ch = word.charAt(i);
            int index = ch - 'a';
            if (node.children[index] == null) {
                node.children[index] = new Trie();
            }
            node = node.children[index];
        }
        //当前节点 node 为 word 的结尾节点
        node.isEnd = true;
    }
    
    //搜索字符串
    public boolean search(String word) {
        Trie node = searchPrefix(word);
        return node != null && node.isEnd;
    }
    
    //判断前缀 prefix 是否存在于前缀树中
    public boolean startsWith(String prefix) {
        return searchPrefix(prefix) != null;
    }
    
    //返回前缀 prefix 的最后一个字符所在的节点
    public Trie searchPrefix(String prefix) {
        Trie node = this;
        for (int i = 0; i < prefix.length(); i++) {
            char ch = prefix.charAt(i);
            int index = ch - 'a';
            if (node.children[index] == null) {
                return null;
            }
            node = node.children[index];
        }
        return node;
    }
}

/**
 * Your Trie object will be instantiated and called as such:
 * Trie obj = new Trie();
 * obj.insert(word);
 * boolean param_2 = obj.search(word);
 * boolean param_3 = obj.startsWith(prefix);
 */

(2)下面对代码中的一些细节进行说明:

  • 插入字符串
    从字典树的根开始,插入字符串。对于当前字符对应的子节点,有以下两种情况:
    ① 子节点存在。沿着指针移动到子节点,继续处理下一个字符。
    ② 子节点不存在。创建一个新的子节点,记录在 children 数组的对应位置上,然后沿着指针移动到子节点,继续搜索下一个字符。
    重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾,即令 isEnd = true
  • 查找前缀
    从字典树的根开始,查找前缀。对于当前字符对应的子节点,有以下两种情况:
    ① 子节点存在。沿着指针移动到子节点,继续搜索下一个字符。
    ② 子节点不存在。说明字典树中不包含该前缀,返回空指针。
    重复以上步骤,直到返回空指针或搜索完前缀的最后一个字符。若搜索到了前缀的末尾,就说明字典树中存在该前缀。此外,若前缀末尾对应节点的 isEnd 为 true,则说明字典树中存在该字符串

(3)复杂度分析:
① 时间复杂度:初始化为 O(1),其余操作为 O(|S|),其中 |S| 是每次插入或查询的字符串的长度
② 空间复杂度:O(∣T∣⋅Σ),其中 |T| 为所有插入字符串的长度之和,Σ 为字符集的大小,这里只存储所有的小写字母,即 Σ = 26。

(4)现在以下面的这些单词为例,来构造前缀树

 {"good", "gold", "send", "sence", "word", "world"}

分析这些单词后可以发现:
① “good” 和 “gold” 的公共前缀为 “go”;
② “send” 和 “sence” 的公共前缀为 “sen”;
③ “word” 和 “world” 的公共前缀为 “wor”;
最终构造的前缀树如下图所示:
在这里插入图片描述

3.应用

(1)前缀树的典型应用是用于统计、排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高

(2)大家可以去 LeetCode 上找相关的前缀树题目来练习,或者也可以直接查看 LeetCode算法刷题目录(Java)这篇文章中的前缀树章节。此外,如果大家发现文章中的错误之处,可在评论区中指出。

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

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

相关文章

pytorch 分布式调试debug torch.distributed.launch

文章目录一. pytorch 分布式调试debug torch.distributed.launch 三种方式1. 方式1&#xff1a;ipdb调试&#xff08;建议&#xff09;命令行使用pdb未解决&#xff1a;2. 方式2&#xff1a;使用pycharm进行分布式调试&#xff08;侵入式代码&#xff09;3. 方式3&#xff1a;使…

HRNet源码阅读笔记(5),庞大的PoseHighResolutionNet模块-transition1

在stage1的最后&#xff0c;分支了。就是所谓的transition1&#xff0c;详见下面的第13行。def forward(self, x):x self.conv1(x)x self.bn1(x)x self.relu(x)x self.conv2(x)x self.bn2(x)x self.relu(x)x self.layer1(x)x_list []for i in range(self.stage2_cfg[NU…

【前端之旅】Webpack模块打包工具

一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…

【图的存储】

更好的阅读体验\color{red}{更好的阅读体验}更好的阅读体验 文章目录1. 邻接矩阵2. 边集数组3. 邻接表4. 链式邻接表5. 链式前向星总结1. 邻接矩阵 思想&#xff1a; 利用二维数组 g[N][N] 存储所有的点到点的权值。其中 N 为点的数量&#xff0c;g[i][j] 表示点 i 到点 j 的权…

【C++】容器适配器

文章目录一. 什么是适配器?什么是容器适配器?二.理解容器适配器stack的模拟实现queue的模拟实现一. 什么是适配器?什么是容器适配器? 适配器是一种设计模式&#xff08;设计模式是一套被反复使用的&#xff0c;多数人知晓的&#xff0c;经过分类编目的&#xff0c;代码设计…

CAD未协调的新图层怎么处理?

在打开CAD图纸时&#xff0c;系统提示图形存在为协调的新图层是什么意思&#xff1f;所谓未协调图层&#xff0c;是指上次打印或者保存之类命令后新增的图层&#xff0c;大部分情况下增加新的外部参照时会把所有外部参照中的图层标记为未协调图层。CAD未协调的新图层怎么处理&a…

2023年底,我要通过这5点,实现博客访问量500W

说实话&#xff0c;这真的是一个非常高远的flag&#xff0c;因为我目前只有35W&#xff0c;但根据我2个月前还是12W的访问量&#xff0c;我觉得我还是可以拼一把的&#xff0c;在这里我想向大家分享一下我的计划&#xff0c;如何达成2023年底&#xff0c;博客访问量达到500W的K…

期刊会议排名、信息检索网站推荐、IEEE Latex模板下载(更新中...)

一.拿到一个期刊或论文&#xff0c;不知道他的影响因子、分区类型等等信息&#xff0c;可以使用以下几个网站搜索一下。二.一些会议期刊搜索1.国外The Latest Information Technology Conference and Journal List - Conference Partner&#xff08;信息技术最新国际会议和期刊…

Java程序员必知四种负载均衡算法

前言 一般来说&#xff0c;我们在设计系统的时候&#xff0c;为了系统的高扩展性&#xff0c;会尽可能的创建无状态的系统&#xff0c;这样我们就可以采用集群的方式部署&#xff0c;最终很方便的根据需要动态增减服务器数量。但是&#xff0c;要使系统具有更好的可扩展性&…

直观理解--马氏距离

首先我们很了解欧氏距离了&#xff0c;就是用来计算欧式空间&#xff08;就是我们常见的坐标系&#xff09;中两个点的距离的。 比如点 x(x1,…,xn)x (x_1,…,x_n)x(x1​,…,xn​) 和 y(y1,…,yn)y (y_1,…,y_n)y(y1​,…,yn​) 的欧氏距离为&#xff1a; d(x,y)(x1−y1)2(x2…

依靠小游戏带动产品增收,app运营这样做

大家都玩过小游戏吧&#xff1f;从小时候的4399游戏平台到现在的微信小游戏&#xff0c;尤其是风靡一时的“跳一跳”和“羊了个羊”都曾上榜热搜&#xff0c;让人印象深刻。在当下小游戏爆火社交平台的不断出现的背景下&#xff0c;小游戏的发展劲头更是强盛。 小游戏的吸引力在…

Memblaze发布大容量企业级SSD:支持32T最大容量,性能更强!

2023年1月10日 —— 今天&#xff0c;北京忆恒创源科技股份有限公司&#xff08;Memblaze&#xff09;正式发布 PBlaze6 6930 系列 PCIe 4.0 企业级 NVMe SSD。PBlaze6 6930 面向企业高性能业务应用开发&#xff0c;有着 1600K/680K IOPS 的 4K 随机读/写性能&#xff0c;具备更…

Mysql常见面试题

Mysql常见面试题汇总①⭐事务的基本特性和隔离级别⭐ACID靠什么保证⭐什么是MVCC⭐mysql的主从同步原理简述MyISAM和InnoDB的区别简述mysql中索引类型以及对数据库的性能影响⭐索引的基本原理Mysql聚簇索引和非聚簇索引的区别⭐B树和B树的区别&#xff0c;为什么Mysql使用B树My…

第04讲:Docker部署MySQL8

MySQL 的 Docker 镜像在 dockerhub 上的地址&#xff1a;https://hub.docker.com//mysql 当前&#xff08;2021-04-02&#xff09;的 latest 和 8.0.23 是同一个镜像 。另外&#xff0c;5.7 版本和 5.7.33 是同一个镜像 第1步&#xff1a;安装mysql 查询中央仓库 docker se…

Kestrel封装在WindowService中(.net5,.net6,.net7三个版本的介绍)

Kestrel封装在WindowServer中背景关于WindowsServer开发服务.NET5版本建项目添加Controller添加引用修改Startup.cs修改Program.cs配置Kestrel监听发布程序通过命令行创建服务关于SC命令启动服务查看效果测试效果.NET6错误1解决办法&#xff1a;错误2运行效果如下图.NET7版本&a…

千锋教育嵌入式物联网教程之系统编程篇学习-01

目录 课程视频链接 笔记目的 什么是系统编程 如何操作内核的系统调用 系统调用的分类​编辑 系统调用的返回值 系统调用IO函数 文件描述符 文件IO文件描述符与标准IO的文件指针对应关系 Man手册使用 open函数 函数调用失败打印错误 close函数 测试一个进程最多能产生多少个…

如何准备pmp考试?

一、考前五准备 1.知识准备&#xff1a;读透教材&#xff0c;仔细回顾知识点&#xff0c;明确知识框架&#xff0c;模考题考前正确率达到95%。 2.精神准备&#xff1a;明确目标&#xff0c;有信心&#xff0c;不要焦虑。 3.精力准备&#xff1a;科学安排考前的复习和休息时间…

【nvivo11plus教程】03_查询+自动编码

注&#xff1a;nvivo11也可以使用自动编码的。我是在第一次使用自动编码的时候&#xff0c;它弹出来一个界面让我下载安装包&#xff0c;但是网速特别慢&#xff0c;需要5、6个小时&#xff0c;然后我电脑开了一个晚上&#xff0c;第二天早上显示下载失败&#xff0c;但是可以使…

十一、路由

一、前端路由的概念与原理 1.1、什么是路由 路由&#xff08;英文&#xff1a;router&#xff09;就是对应关系。 1.2、SPA与前端路由 SPA 指的是一个web网站只有唯一的一个HTML页面&#xff0c;所有组件的展示与切换都在这唯一的一个页面内完成。此时&#xff0c;不同组件…

【 java 集合】Collections工具类的使用

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…