字典树介绍

方法介绍
1.1、什么是Trie树
Trie树,即字典树,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是最大限度地减少无谓的字符串比较,查询效率比较高。

Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

它有3个基本性质:

根节点不包含字符,除根节点外每一个节点都只包含一个字符。
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
每个节点的所有子节点包含的字符都不相同。
1.2、树的构建
咱们先来看一个问题:假如现在给你10万个长度不超过10的单词,对于每一个单词,我们要判断它出没出现过,如果出现了,求第一次出现在第几个位置。对于这个问题,我们该怎么解决呢?

如果我们用最傻的方法,对于每一个单词,我们都要去查找它前面的单词中是否有它。那么这个算法的复杂度就是O(n^2)。显然对于10万的范围难以接受。

换个思路想:

假设我要查询的单词是abcd,那么在它前面的单词中,以b,c,d,f之类开头的显然不必考虑,而只要找以a开头的中是否存在abcd就可以了。
同样的,在以a开头中的单词中,我们只要考虑以b作为第二个字母的,一次次缩小范围和提高针对性,这样一个树的模型就渐渐清晰了。
即如果现在有b,abc,abd,bcd,abcd,efg,hii 这6个单词,我们可以构建一棵如下图所示的树:

如上图所示,对于每一个节点,从根遍历到他的过程就是一个单词,如果这个节点被标记为红色,就表示这个单词存在,否则不存在。

那么,对于一个单词,只要顺着他从根走到对应的节点,再看这个节点是否被标记为红色就可以知道它是否出现过了。把这个节点标记为红色,就相当于插入了这个单词。

这样一来我们查询和插入可以一起完成,所用时间仅仅为单词长度(在这个例子中,便是10)。这就是一棵trie树。

我们可以看到,trie树每一层的节点数是26^i级别的。所以为了节省空间,我们还可以用动态链表,或者用数组来模拟动态。而空间的花费,不会超过单词数×单词长度。

1.3、查询
Trie树是简单但实用的数据结构,通常用于实现字典查询。我们做即时响应用户输入的AJAX搜索框时,就是Trie开始。本质上,Trie是一颗存储多个字符串的树。相邻节点间的边代表一个字符,这样树的每条分支代表一则子串,而树的叶节点则代表完整的字符串。和普通树不同的地方是,相同的字符串前缀共享同一条分支。

下面,再举一个例子。给出一组单词,inn, int, at, age, adv, ant, 我们可以得到下面的Trie:

可以看出:

每条边对应一个字母。
每个节点对应一项前缀。叶节点对应最长前缀,即单词本身。
单词inn与单词int有共同的前缀“in”, 因此他们共享左边的一条分支,root->i->in。同理,ate, age, adv, 和ant共享前缀"a",所以他们共享从根节点到节点"a"的边。
查询操纵非常简单。比如要查找int,顺着路径i -> in -> int就找到了。

搭建Trie的基本算法也很简单,无非是逐一把每则单词的每个字母插入Trie。插入前先看前缀是否存在。如果存在,就共享,否则创建对应的节点和边。比如要插入单词add,就有下面几步:

考察前缀"a",发现边a已经存在。于是顺着边a走到节点a。
考察剩下的字符串"dd"的前缀"d",发现从节点a出发,已经有边d存在。于是顺着边d走到节点ad
考察最后一个字符"d",这下从节点ad出发没有边d了,于是创建节点ad的子节点add,并把边ad->add标记为d。
问题实例
1、一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析

提示:用trie树统计每个词出现的次数,时间复杂度是O(nle)(le表示单词的平均长度),然后是找出出现最频繁的前10个词。当然,也可以用堆来实现,时间复杂度是O(nlg10)。所以总的时间复杂度,是O(nle)与O(nlg10)中较大的哪一个。

2、寻找热门查询

原题:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复读比较高,虽然总数是1千万,但是如果去除重复和,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。

提示:利用trie树,关键字域存该查询串出现的次数,没有出现为0。最后用10个元素的最小推来对出现频率进行排序。

参考链接:https://github.com/zhanzecheng/The-Art-Of-Programming-By-July/blob/master/ebook/zh/06.09.md

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

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

相关文章

LeetCode 50. Pow(x, n)(二分查找)

文章目录1. 题目2. 二分查找2.1 递归2.2 循环1. 题目 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数。 示例 输入: 2.00000, 10 输出: 1024.00000 示例 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 1/22 1/4 0.25 说明: -100.0 < x < 100.0 n 是 32 位有符号…

OpenKG 祝大家 2021 新年快乐 —「2020 精选文章汇编」

过去的一年是不寻常的一年&#xff0c;虽然疫情改变了所有人的生活&#xff0c;但是它并没有击垮我们。这一年&#xff0c;大家依旧保持着开源开放的精神&#xff0c;持续地分享着知识图谱领域的技术动态、应用实践&#xff0c;同学们也持续不断地输出优质的论文笔记。OpenKG 继…

智能分析最佳实践——指标逻辑树

所有业务都会面对“为什么涨、为什么降、原因是什么&#xff1f;”这种简单粗暴又不易定位的业务问题。为了找出数据发生异动的原因&#xff0c;业务人员会通过使用多维查询、dashboard等数据产品锁定问题&#xff0c;再辅助人工分析查找问题原因&#xff0c;这个过程通常需要一…

论文浅尝 - EMNLP2020 | 图结构对于多跳问答而言必要吗?

笔记整理 | 陈卓&#xff0c;浙江大学计算机科学与技术系&#xff0c;博士研究生研究方向 | 知识图谱&#xff0c;图神经网络&#xff0c;多模态论文链接&#xff1a;https://www.aclweb.org/anthology/2020.emnlp-main.583.pdf发表会议&#xff1a;EMNLP 2020背景提要抽取式阅…

为什么每次有人大声通电话时,我就很烦躁...

文 | Chaos编 | 小戏不知你是否有过这样的体验&#xff0c;当你周围有人在大声讲电话时&#xff0c;你会不自觉的感觉到烦躁。为什么呢&#xff1f;有一种委婉的说法是因为你听到了不完整的对话。直白点说其实就是讲电话的人通过放大声音强行让你接收了他说的信息&#xff0c;但…

LeetCode 367. 有效的完全平方数(二分查找)

1. 题目 给定一个正整数 num&#xff0c;编写一个函数&#xff0c;如果 num 是一个完全平方数&#xff0c;则返回 True&#xff0c;否则返回 False。 说明&#xff1a;不要使用任何内置的库函数&#xff0c;如 sqrt。 示例 1&#xff1a; 输入&#xff1a;16 输出&#xff1…

美团点评联盟广告场景化定向排序机制

在美团点评的联盟广告投放系统&#xff08;DSP&#xff09;中&#xff0c;广告从召回到曝光的过程需要经历粗排、精排和竞价及反作弊等阶段。其中精排是使用CTR预估模型进行排序&#xff0c;由于召回的候选集合较多&#xff0c;出于工程性能上的考虑&#xff0c;不能一次性在精…

论文浅尝 - COLING2020 | 一种用于跨语言实体对齐的上下文对齐强化跨图谱注意力网络...

笔记整理 | 谭亦鸣&#xff0c;东南大学博士生来源&#xff1a;COLING 2020链接&#xff1a;https://www.aclweb.org/anthology/2020.coling-main.520.pdf本文发现&#xff0c;目前基于GCN的对齐方法都是分别考虑两个KG&#xff0c;然后分别学习它们的embedding&#xff0c;并认…

LeetCode 744. 寻找比目标字母大的最小字母(二分查找)

1. 题目 给定一个只包含小写字母的有序数组letters 和一个目标字母 target&#xff0c;寻找有序数组里面比目标字母大的最小字母。 数组里字母的顺序是循环的。举个例子&#xff0c;如果目标字母target ‘z’ 并且有序数组为 letters [‘a’, ‘b’]&#xff0c;则答案返回…

NLP 综述的综述

NLP 综述的综述&#xff1a;https://mp.weixin.qq.com/s/3DvXDLFQJnIrXFWVGowTjw

超越YOLOv5,1.3M超轻量,高效易用,这个目标检测开源项目太香了!

这个目标检测神器简直香炸了&#xff01;它不仅连续登录Github全球趋势榜&#xff0c;拥有的全球尖端算法论文也接连登录全球技术趋势榜PaperWithCode。这个神器就是刚刚全面升级的PaddleDetection2.0&#xff01;它全面兼顾高性能算法、便捷开发、高效训练及完备部署&#xff…

MyFlash——美团点评的开源MySQL闪回工具

由于运维、DBA的误操作或是业务bug&#xff0c;我们在操作中时不时会出现误删除数据情况。早期要想恢复数据&#xff0c;只能让业务人员根据线上操作日志&#xff0c;构造误删除的数据&#xff0c;或者DBA使用binlog和备份的方式恢复数据&#xff0c;不管那种&#xff0c;都非常…

论文浅尝 - ACL2020 | 用于多媒体事件提取的跨媒体结构化公共空间

笔记整理 | 王琰&#xff0c;东南大学来源&#xff1a;ACL 2020链接&#xff1a;https://arxiv.org/pdf/2005.02472.pdf概述本论文引入一项新任务&#xff1a;多媒体事件提取&#xff08;ME&#xff09;&#xff0c;该任务旨在从多模态中抽取出事件和其论点(M2E2)。此外&#x…

屠榜CV还不是这篇论文的终极目标,它更大的目标其实是……

文 | 魏旭编 | 橙橙子&#xff0c;小戏当 BERT 模型出来之后&#xff0c;Transformer 架构基本成为 NLP 任务的底色。诸如 Roberta、XLNet、ELECTRA、GPT3 等刷榜各类 NLP 任务的模型&#xff0c;无一不是基于 Transformer 框架。无疑&#xff0c;Transformer 开启了 NLP 的统治…

day01『NLP打卡营』实践课1:词向量应用演示

Day01 词向量作业辅导 本教程旨在辅导同学如何完成 AI Studio课程——『NLP打卡营』实践课1&#xff1a;词向量应用展示 课后作业。 1. 选择词向量预训练模型 在PaddleNLP 中文Embedding模型查询PaddleNLP所支持的中文预训练模型。选择其中一个模型&#xff0c;如中文维基百…

流计算框架 Flink 与 Storm 的性能对比

1. 背景 Apache Flink 和 Apache Storm 是当前业界广泛使用的两个分布式实时计算框架。其中 Apache Storm&#xff08;以下简称“Storm”&#xff09;在美团点评实时计算业务中已有较为成熟的运用&#xff08;可参考 Storm 的可靠性保证测试&#xff09;&#xff0c;有管理平台…

论文浅尝 - AAAI2021 | 基于对比学习的三元组生成式抽取方法

作者 | 叶宏彬&#xff0c;浙江大学博士研究生&#xff0c;研究方向&#xff1a;知识图谱、自然语言处理接收会议 | AAAI2021论文链接 | https://arxiv.org/pdf/2009.06207.pdf摘要在自然语言处理和知识图谱领域的信息提取中&#xff0c;三元组抽取是必不可少的任务。在本文中&…

LeetCode 101. 对称二叉树(递归循环)

1. 题目 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。1/ \2 2/ \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ \2 2\ \3 3来源&#xff1a;力扣&#xff08;LeetCode&#x…

剑桥大学终身教授T.S.:7大机器学习算法与应用案例

机器学习和人工智能可被应用在文本翻译、面部检测和识别、自动驾驶汽车和诸如国际象棋和围棋一类的极为复杂的控制类游戏等领域&#xff0c;其最新发展日益受到越来越高的关注。本次为大家推荐的科研项目&#xff0c;还是来自于ViaX盐趣&#xff0c;导师是来自剑桥大学计算机系…

Day03『NLP打卡营』实践课3:使用预训练模型实现快递单信息抽取

Day03 词法分析作业辅导 本教程旨在辅导同学如何完成 AI Studio课程——『NLP打卡营』实践课3&#xff1a;使用预训练模型实现快递单信息抽取 课后作业。 1. 更换预训练模型 在PaddleNLP Transformer API查询PaddleNLP所支持的Transformer预训练模型。选择其中一个模型&…