前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >数据结构-前缀树

数据结构-前缀树

作者头像
宅蓝三木
发布于 2024-10-09 13:20:48
发布于 2024-10-09 13:20:48
11400
代码可运行
举报
文章被收录于专栏:三木的博客三木的博客
运行总次数:0
代码可运行

前缀树(Trie)简介

前缀树,也称为字典树,是一种树形数据结构。它的核心思想是利用字符串的公共前缀来减少存储空间和提高查询效率。它由节点组成,每个节点包含多个指向子节点的指针(通常是一个固定大小的数组或者是一个哈希表),以及一个标记位用于表示从根节点到该节点是否构成一个完整的字符串。

工作原理

  • 插入操作 从根节点开始,对于要插入的字符串中的每个字符,检查当前节点是否存在与该字符对应的子节点。 如果不存在,则创建一个新的子节点;如果存在,则沿着对应的子节点继续处理下一个字符。 当处理完字符串的最后一个字符后,将最后到达的节点的标记位置为表示一个完整字符串的结束。
  • 查询操作 同样从根节点开始,按照待查询字符串的字符顺序依次在树中查找对应的子节点。 如果在某一步找不到对应的子节点,则说明该字符串不存在于树中;如果能顺利找到最后一个字符对应的节点且该节点的标记位表示是一个完整字符串的结束,那么说明该字符串存在于树中。
  • 删除操作(相对复杂) 首先要找到要删除的字符串对应的节点路径。 如果该节点是其他字符串的中间节点,则不能直接删除,而是要清除该节点上表示字符串结束的标记位。 如果该节点是叶子节点且没有其他字符串共享该节点的前缀部分,则可以从叶子节点开始依次向上删除节点直到遇到一个节点是其他字符串的中间节点或者是根节点。

主要特点和优势

  • 高效的字符串存储和检索:对于一组具有公共前缀的字符串,前缀树可以大大减少存储所需的空间,并且查询操作的时间复杂度与字符串的长度成正比,在大量字符串的场景下查询效率高。
  • 支持前缀搜索:可以很方便地查找具有某一特定前缀的所有字符串,这在自动补全、拼写检查等应用场景中非常有用。

应用场景

  • 自动补全功能:在搜索引擎、代码编辑器等软件中,当用户输入部分字符时,系统可以根据前缀树快速提供可能的完整字符串,如搜索框自动提示搜索词、代码编辑器自动补全变量名或函数名等。
  • 拼写检查:通过将字典中的单词构建成前缀树,可以快速检查一个输入的字符串是否是一个有效的单词或者找到最接近的正确拼写。
  • IP 路由:在网络中,IP 地址可以看作是由点分隔的数字字符串,利用前缀树可以高效地进行 IP 路由查找,根据 IP 地址的前缀匹配路由规则。
  • 单词统计和文本分析:统计文本中不同单词的出现次数等相关操作。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TrieNode:
    def __init__(self):
        self.children = [None] * 26
        self.value = 0

class MapSum:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.root = TrieNode()


    def insert(self, key: str, val: int) -> None:
        curNode = self.root
        for char in key:
            idx = ord(char) - ord("a")
            if not curNode.children[idx]:
                curNode.children[idx] = TrieNode()
            curNode = curNode.children[idx]
        curNode.value = val

    def _dfs(self, node):
        curNode, res = node, node.value
        for child in curNode.children:
            if child:
                res += self._dfs(child)
        return res


    def sum(self, prefix: str) -> int:
        curNode = self.root
        for char in prefix:
            idx = ord(char) - ord("a")
            if curNode.children[idx]:
                curNode = curNode.children[idx]
            else:
                return 0
        return self._dfs(curNode)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go: 基于前缀树的API路径权限校验方案及实现
在现代Web开发中,API路径的权限校验是确保系统安全性和数据隐私的重要手段。传统的权限校验方法可能效率较低,尤其是当API数量庞大且路径复杂时。前缀树(Trie)作为一种高效的字符串存储和查询数据结构,可以很好地解决这个问题。本文将介绍如何利用前缀树来实现基于API路径的权限校验。
运维开发王义杰
2024/05/30
1290
Go: 基于前缀树的API路径权限校验方案及实现
查找-多路查找详解篇
学编程的小程
2023/10/11
2960
查找-多路查找详解篇
Go 数据结构和算法篇(十三):字符串匹配之 Trie 树
Trie 树,也叫「前缀树」或「字典树」,顾名思义,它是一个树形结构,专门用于处理字符串匹配,用来解决在一组字符串集合中快速查找某个字符串的问题。
学院君
2023/03/03
1.4K0
Go 数据结构和算法篇(十三):字符串匹配之 Trie 树
实现 Trie (前缀树)
Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
狼啸风云
2024/02/03
1630
实现 Trie (前缀树)
一种好用的树结构:Trie树
在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
致Great
2022/05/13
5440
一种好用的树结构:Trie树
图解 LeetCode 第 642 号问题:搜索自动完成系统
LeetCode上第 642 号问题:Design Search Autocomplete System
五分钟学算法
2019/01/23
1.3K0
图解 LeetCode 第  642 号问题:搜索自动完成系统
Go: 高效处理字符串的利器,前缀树及其算法研究
前缀树(Trie),又称字典树,是一种专门处理字符串的数据结构。它能够高效地进行字符串插入、删除和查找操作。前缀树特别适用于需要快速搜索的应用场景,如自动补全、拼写检查和IP路由查找等。
运维开发王义杰
2024/05/29
2650
Go: 高效处理字符串的利器,前缀树及其算法研究
每日一题 | Python3 实现「208. 实现 Trie(前缀树)」
https://leetcode-cn.com/problems/implement-trie-prefix-tree/
与你一起学算法
2021/04/28
1.3K0
每日一题 | Python3 实现「208. 实现 Trie(前缀树)」
添加与搜索单词 - 数据结构设计
请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
狼啸风云
2023/12/03
1940
字典树概念与题型解析
这次讲一个不经常被人提起的数据结构 - 字典树,虽说知名度不高,但是这个数据结构可以解决其他数据结构所不能解决,或者是比较难解决的问题,而且性能方面,相对于其他的功能类似的数据结构会更优,文章会从概念与基本实现,性能分析,题型解析三大方向来介绍字典树。
五分钟学算法
2019/10/18
5940
【图解算法】模板+变式——带你彻底搞懂字典树(Trie树)
接下来将对经典的字典树进行代码实现;接着做几个变体题目深入理解字典树的强大;最后回到日常生活,瞧瞧字典树怎样融入到了我们的生活之中 >_<
全栈程序员站长
2022/10/04
1.4K0
【图解算法】模板+变式——带你彻底搞懂字典树(Trie树)
什么是前缀树--打开了我的新思路
今天继续来讲面试,已经出了将近十个美团java一面真题系列文章了,今天来讲一讲前缀树,相信大多数小伙伴对这个前缀树是很陌生的,有些甚至都没有听说过“前缀树”这个词,说实话我也是看面经才知道这个词的
用户7656790
2020/08/13
3.3K0
什么是前缀树--打开了我的新思路
前缀树算法模板秒杀 5 道算法题
Trie 树又叫字典树、前缀树、单词查找树,是一种二叉树衍生出来的高级数据结构,主要应用场景是处理字符串前缀相关的操作。
labuladong
2022/01/24
2.2K0
前缀树算法模板秒杀 5 道算法题
(Leetcode 2021 刷题计划) 208. 实现 Trie (前缀树)
Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
windism
2021/04/14
4220
数据结构 | 30行代码,手把手带你实现Trie树
今天是算法和数据结构专题的第28篇文章,我们一起来聊聊一个经典的字符串处理数据结构——Trie。
TechFlow-承志
2020/07/08
4660
字典树,不就有点不一样的一颗树
字典树,是一种空间换时间的数据结构,又称Trie树、前缀树,是一种树形结构(字典树是一种数据结构),典型用于统计、排序、和保存大量字符串。所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
bigsai
2021/05/17
7620
字典树,不就有点不一样的一颗树
[奇怪但有用的数据结构]Trie前缀树
想象一个这样的情景,有一个很大的字典包含了很多的单词,需要判断一个新单词是否在字典中,最直接也最快的办法就是使用哈希表了。现在添加一个条件,判断字典里是否存在单词以新单词为前缀,这时候哈希表就不合适了,因为存在单词在字典中但其前缀不在字典中的情况,例如[‘apple’, 'application','append']这个字典并不包含他们的公共前缀'app','ap'和‘a’。所以我们需要一种新的数据结构和算法来处理这类问题。
杜逸先
2018/06/08
2K0
[奇怪但有用的数据结构]Trie前缀树
Trie树
他会自动显示相关的搜索,不知道有没有想过这个功能是如何实现的呢?面对海量的数据,它怎么能在我输入的同时,如此快速的检索到相关内容呢?当我查找资料后,就遇到了它,Trie树。
烟草的香味
2019/11/11
6530
Trie树
数据结构(12)-- 前缀树(字典树、Trie)
可以用来提取出表中所有以“ABC”开头的数据,但是数据表浩如烟海,你总不能让我去遍历吧!!!
看、未来
2021/09/18
7590
☆打卡算法☆LeetCode 208. 实现 Trie (前缀树) 算法解析
大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。
恬静的小魔龙
2022/09/27
4650
☆打卡算法☆LeetCode 208. 实现 Trie (前缀树)   算法解析
相关推荐
Go: 基于前缀树的API路径权限校验方案及实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验