数据结构八-Trie树

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。

1 Trie树的使用场景

搜索引擎中的搜索词建议。当你在搜索引擎中输入词,搜索引擎提示给你一个词的列表,帮助你快速输入想搜索的词。

这个功能要想想做得精准,肯定需要很多优化工作。但这个功能的底层数据结构就是Trie树。

2 什么是Trie树

Trie树也叫字典树,是一种树形结构,专门用于处理在一个字符串集合中查找某个字符串。

2.1 Trie树的结构

例如需要在how,hi,her,hello,so,see这六个字符串中查找某个字符串。我们也可以用字符串和这6个字符串逐个比较,只是效率不高。使用Trie树只需要一次比较就可以。我们先用这六个字符串构建一个Trie树。

之后每次查找从Trie树的根节点开始查找。Trie树是利用字符串之间的公共前缀,将重复的前缀合并在一起。根节点不包含任何信息,每个节点是字符串中的一个字符。从根节点到红色节点的一条路径表示一个字符串。重点:红色节点并不都是叶子节点,例子中没有表示出来。

2.2 Trie树的构造过程

2.3 Trie树的查找过程

当我们查找一个字符串的时候从根节点开始。例如查找字符串"her",我们把字符串切分成字符h e r,从根节点开始,走出路径:/->h->e->r,并且r节点有字符串结束标志,树中包含字符串her。
例如我们查找字符串"he",我们把字符串切分成字符h e。从根节点开始,走出路径:/->h->e。但是e没有字符串结束标志,所以树中不包含he。

3 Trie树代码实现

Trie树的操作包括初始化和查找。
Trie树是一棵多叉树。在二叉树的时候节点每个节点是用左右指针指向子节点。

class BinaryTreeNode {char data;BinaryTreeNode left;BinaryTreeNode right;  
}

Trie树是一个多叉树,怎么存储节点的子节点呢?一种方法是假设字符串只包含小写字母,可以在字母和数组下标之间做映射,使用数组存储子节点。如果子节点的字母是a,存储在children[0];如果子节点的字母是b,存储在children[1]…

class TrieNode {char data;TrieNode children[26];
}

整体代码:

public class Trie {private TrieNode root = new TrieNode('/');public void insert(String text){char[] chars = text.toCharArray();TrieNode node = root;for(int i=0;i<chars.length;i++){int idx = chars[i] - 'a';if(node.childern[idx]==null){node.childern[idx] = new TrieNode(chars[i]);}node = node.childern[idx];}node.endWord = true;}public boolean find(String text){TrieNode node = root;char[] chars = text.toCharArray();for(int i=0;i<chars.length;i++){int idx = chars[i] - 'a';if(node.childern[idx]==null){return false;}node = node.childern[idx];}return node.endWord;}class TrieNode{private char data;private TrieNode[] childern;private boolean endWord;public TrieNode(char ch){this.data = ch;}}
}

Trie树的时间复杂度。Trie树构建的时候需要遍历所有的字符,时间复杂度O(n)。n为 所有字符串长度之和。查找的时候每个字符遍历一次,时间复杂度O(m),m是查找字符串长度。

4 Trie树适合解决的问题

4.1 Trie树的缺点:耗内存

上面的代码中每个节点都需要长度为26的数组存储子节点。但是并不是每个字母后面都会跟着26个字母,很多数组 中的值是空的。
这还是只考虑了小写字母的情况,当要存储的包含数字、中文的时候按照这种方式存储会需要 更多的内容。这个时候可以考虑使用哈希表存储子节点。也可以使用有序数组、跳表、红黑树等,牺牲一定的性能。例如使用有序数组,那插入的时候要维护数组有序,多消耗时间,查询每一层子节点的时候不是O(1),而是需要二分。

4.2 Trie树的优点:前缀匹配

对于支持动态数组高效操作的数据结构有散列表、红黑树、跳表等。这些数据结构也可以实现字符串查找。而Trie树除了字符串匹配之外,更常用于字符串前缀匹配。就是前面提到的搜索词提示。词库是用户的热门搜索词,这些词构建一棵Trie树。我们把用户输入的词作为前缀子串去Trie树中匹配,将匹配到的字符串返回。
实际工程中会遇到 一些问题需要解决:
1 词库中匹配到的词可能很多,怎么排序?
2 在用户拼写错误的情况下依然能够返回正确的提示词,怎么做到?

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

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

相关文章

[安全模型][Cambria Math][A][]敌手A-> 怎么打出来?

字母A 设置字体 “Cambria Math” -> &#x1d49c;

第五十期:详解语音识别技术的发展

在我们的生活中交流起着重要的作用。人类从符号开始&#xff0c;然后发展到用语言交流&#xff0c;再后来出现了计算和通信技术。在某些情况下&#xff0c;机器不仅与人类交流&#xff0c;也与机器之间交流。计算机和通信技术创造了互联网世界&#xff0c;正如我们所知的物联网…

打造移动测试云平台

转载来源&#xff1a;https://blog.csdn.net/toafu/article/details/80598977 背景 移动技术发展到现阶段&#xff0c;原生、混合式技术发展的足够成熟&#xff0c;可以无缝融合。而随着移动技术的发展和革新&#xff0c;移动领域的测试技术和实践也有了一定发展&#xff1a;工…

AC自动机:多模式串匹配实现敏感词过滤

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 敏感词过滤场景 在很多支持用户发表内容的网站&#xff0c;都有敏感词过滤替换的功能。例如将一些淫秽、反动内容过滤掉&#xff0c;或者替换为****。在一些社交类…

[毕业论文][格式修改][摘要修改]毕业论文格式内容修改小技巧

背景 毕业季临近&#xff0c;盲审前对毕业论文进行最后一次逐行逐字修改&#xff0c;遇到的一些问题和解决办法 1.自动生成的目录行距可能不一。需要选中后单独再段落种设置行距 2.符号问题 配合查找发现问题 双引号 英文 “English” 中文“” 逗号 英文 English, 中文 &am…

第五十一期:AIOps落地关键点指南

随着越来越多企业愿意在运营中采用AIOps的模式&#xff0c;他们所要面对的问题是&#xff1a;如何以与业务需求相适应的方式来接受它。我们为您准备的一些有关AIOps落地关键点指南。 作者&#xff1a;陈峻 【51CTO.com快译】随着系统效率和复杂程度的日益提高&#xff0c;我们…

算法六——贪心

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 背豆子的例子 假设我们有一个可以容纳 100kg 物品的背包&#xff0c;可以装各种物品。我们有以下 5 种豆子&#xff0c;每种豆子的总量和总价值都各不相同。为了让…

BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP + 带权重心

Description Bessie正在计划一年一度的奶牛大集会&#xff0c;来自全国各地的奶牛将来参加这一次集会。当然&#xff0c;她会选择最方便的地点来举办这次集会。每个奶牛居住在 N(1<N<100,000) 个农场中的一个&#xff0c;这些农场由N-1条道路连接&#xff0c;并且从任意一…

第五十二期:Java开发数据库设计的14个技巧,你知道几个?

可以是一对一、一对多、多对多的关系。在一般情况下&#xff0c;它们是一对一的关系&#xff1a;即一张原始单据对应且只对应一个实体。在特殊情况下&#xff0c;它们可能是一对多或多对一的关系&#xff0c;即一张原始单证对应多个实体&#xff0c;或多张原始单证对应一个实体…

《鸟哥的Linux私房菜--基础篇》学习

第四章 显示日期与时间的指令&#xff1a;date 输入&#xff1a; (base) liyihuadeMacBook-Pro:~ liyihua$ date 输出&#xff1a; Thu Jun 6 08:44:02 CST 2019显示日历指令&#xff1a;cal 输入&#xff1a; (base) liyihuadeMacBook-Pro:~ liyihua$ cal 输出&#xff1a; J…

第五十三期:公司如何选择数据库?DynamoDB、Hadoop和MongoDB 大比拼

随着公司数据存储方式的不断扩展&#xff0c;本文旨在比较公司使用的一些更现代的数据库系统——了解DynamoDB&#xff0c;Hadoop和MongoDB可以提供哪些功能将帮助用户针对业务模型做出更好的决策。 作者&#xff1a;久谦 用户如何选择最能满足当前业务需求的数据库&#xff…

[引用格式][中文论文][毕业论文]毕业论文引用格式 英文引用文献间隔过大

英文引用文献间隔过大&#xff0c;需要选中该条英文引用文献&#xff0c;在段落设置的中文版式设置西文换行&#xff0c;设置后再进行微调 设置前 设置后 设置方法

动态规划——0-1背包问题

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 0-1背包问题 背包能够承受的总重量一定w&#xff0c;每个物品的总量不同int[] weight表示。怎么放才能让背包中物品的总重量最大。 每次决定一种物品&#xff0c…

第五十四期:MongoDB与MySQL:如何选择

MongoDB和MySQL分别是领先的开源NoSQL和关系数据库。哪个最适合您的应用程序? 作者&#xff1a;XEyes行走的CODE来源 MongoDB和MySQL分别是领先的开源NoSQL和关系数据库。哪个最适合您的应用程序? 在1990年代的互联网泡沫时期&#xff0c;用于Web应用程序的一种通用软件堆栈…

动态规划——矩阵中的最短路径长度

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 题目 假设我们有一个 n 乘以 n 的矩阵 w[n][n]。矩阵存储的都是正整数。棋子起始位置在左上角&#xff0c;终止位置在右下角。我们将棋子从左上角移动到右下角。每次…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第19篇]Shamir密钥交换场景

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 Shamir密钥交换场景是一个被Adi Shamir提出的算法.算法允许多方分割一个密码,例如一个密钥.当足够多的秘密结…

第五十五期:MongoDB数据库误删后的恢复

如果部署的是 MongoDB 复制集&#xff0c;这时还有一线希望&#xff0c;可以通过 oplog 来尽可能的恢复数据;MongoDB 复制集的每一条修改操作都会记录一条 oplog&#xff1b;如果对 MongoDB 做了全量备份 增量备份&#xff0c;那么可以通过备份集及来恢复数据。 作者&#xf…

037-PHP如何返回闭包函数实例

<?php /*: 如何返回闭包函数实例*/# 直接调用将不会输出$txt的内容function demo(){$txt 我爱PHP;$func function () use ($txt) {echo $txt;};# 这里不再直接调用&#xff0c;而且是把实例返回return $func; # 区别于直接写 $func;}# 测试一下 $res demo(); // 函数返…

动态规划——莱文斯坦距离

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 莱文斯坦距离 在搜索引擎中会有搜索词纠错的功能。这个功能背后的原理是编辑距离。 编辑距离 编辑距离是量化两个词之间的相似度。 编辑距离是指将一个字符串变为…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第18篇]画一个/描述ECB,CBC,CTR模式的操作

操作模式:块密码的安全性依赖于加解密一个固定长度的明文块.当加密或者解密消息的时候,块是被需要的.我们使用一种操作模式将明文的多个块链接在一起.我们会知道,这种链接在一起的方法是十分重要. 电子密码本(ECB)模式:加密,解密. ECB模式是最直接的方法.明文被分割成m块.每一…