Burst trie(爆炸式字典树)解读
burst trie(爆炸式字典树)
Burst trie组成介绍
burst trie有三个不同的组成部分,一组records,一组containers,还有一个access trie。
- records包含一个字符串,必要信息(统计数据或单词位置等),一个指针(指向实体数据的指针)
- containers是一个records的集合,对于一个深度为K的容器,所有字符串的长度至少为k,并且所有字符串的前k个字符都是相同的。
- access trie是containers中的叶子。
Burst trie例子
看不懂上面的解析,没关系,看下面的图,下面的图中存储这这10个单词,分别是:“came”, “car”,“cat”, “cave”, “cy”, “cyan”, “we”, “went”, “were”, “west”
。
该图中存储“came”
的位置可以说是一个records,record除了代表字符串,还包含一些该单词的必要信息,以及一个指向实体数据位置的指针。
图中画出的burst trie中最左边的container包含了4个records,分别是“came”, “car”,“cat”, “cave”
,明显它们都有一个共同的前缀"ca"
,所以该contain的深度为2 ,并且里面record代表的字符串长度不能少于2.
图中三角形框住的是container的叶子节点,也称为access trie。其中,图中的access trie数据结构是BST,所以这个Burst trie是一个基于BST的代表容器。
Burst trie查找
Burst trie查找主要分两大步骤,前缀的查找,和后缀的匹配。
前缀查找,从根节点开始,进行字符的匹配,分两小步:
- 从槽中找到当前字符,并且当前字符有进入下一个槽的指针,走下一步,否则匹配失败。遇到access trie,则改为进行后缀匹配(使用BST)
- i++
假设查找“came”
单词的record,搜先查找当前需要匹配字符“C”,在槽中找到"C"
,发现“C”
的位置有进入下一个槽的指针,那么就i++,并进入下一槽。然后匹配字符"A",发现槽中“A”处的下一个指针是access trie,则对剩下的字符串进行后缀匹配(直接使用BST)
Burst trie的生长方式
Burst trie有两种生长方式:
一种是元素的插入,元素的插入会建立新的叶子节点,或者往叶子节中添加新的后缀。
一种是以Burst trie爆破的方式进行生长,Burst trie爆破指的是用深度k的容器替换为一个trie节点和深度k+1的一组新Container的过程。
Burst trie插入
Burst trie插入的过程跟查找相识,前缀的插入和后缀插入。跟查找相似,先进行前缀的匹配添加。
前缀的添加,先槽中找到当前字符,查看当前字符是否有进入下一个槽的指针,没有则进行新叶子(access trie)的建立,有则往下一个槽移动。如果移动到叶子节点,则直接将后缀加入叶子节点(access trie)。
Burst trie爆破
Burst trie爆破指的是用深度k的容器替换为一个trie节点和深度k+1的一组新Container的过程,这些容器之间包含原始容器中的所有记录。决定是否破坏一个Container应该取决于访问它的频率和每次访问的成本如何。
假设现在往Burst trie插入一个records,这个records代表着单词“western”
,并且假设满足爆破条件,那么改图就会进行Container爆破调整,变成下面这副图:
爆破过程如下:
- 先将要爆破的叶子节点(access trie)的数据拿出来
- 然后在匹配的K层字符的槽指向一个新建立的K+1层的槽,然后通过节点添加的方式往K+1层的槽进行叶子节点的添加
具体开源代码,可以参考:https://github.com/gabrieldumitrescu/BurstTrie
参考论文:Heinz S, Zobel J, Williams H E. Burst tries: a fast, efficient data structure for string keys[J]. ACM Transactions on Information Systems (TOIS), 2002, 20(2): 192-223.
论文ppt:http://www.cs.uvm.edu/~xwu/wie/CourseSlides/Schips-BurstTries.pdf
Burst trie(爆炸式字典树)解读相关推荐
- LeetCode Implement Trie (Prefix Tree)(字典树)
问题:实现具有insert,search,startsWith方法的字典树 思路:就是要实现Trie数据结构 具体代码参考: https://github.com/wuli2496/OJ/tree/m ...
- php trie,数据结构-PHP 字典树(Trie)的实现
这篇文章介绍一下字典树的实现原理,又称单词查找树.Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统 ...
- Trie(前缀树/字典树)及其应用
from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...
- Trie树(字典树)详细知识点及其应用
Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...
- 《恋上数据结构第1季》字典树 Trie
字典树Trie Trie 简介 Trie 实现 接口设计 源码 测试 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java 基础推荐看这个: Java 强化笔记目录 Tri ...
- Java实现字典树 Trie
Java实现字典树 Trie 一.字典树介绍 二.Trie实现以及基本的插入查询操作 数组实现: HashMap实现: Trie插入(这里都以数组实现为例): Trie查询: 三.相关例题: 1.le ...
- 数据结构之字典树Trie
文章目录 Trie 字典树 前缀树 什么是Trie 基本概念 基本性质 应用场景 优点 手写一个trie Trie字典树的前缀查询 实现Trie(前缀树) LeetCode208 添加与搜索单词 - ...
- Trie树 -- 高效的字典树
文章目录 简介 原理 构造一棵Trie树 使用Trie树进行查询 实现 模拟(瞎暴力)实现 空间优化 简介 Trie树是一种数据结构,它有一个好听的中文名字,叫"字典树".顾名思义 ...
- 字典树实现_leetcode之820. 单词的压缩编码 | python极简实现字典树
题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell& ...
最新文章
- 云原生如此重要,可惜80%的人都不知道
- OSS控制台集成将数据库实时备份到OSS的功能
- liunx 上传 代码到github
- STM32之option bytes踩坑记录
- ARM指令寻址方式之: 数据处理指令的寻址方式
- GCC + pthread
- 连接mysql数据库小知识记录
- kettle中的switch_kettle 教程(三):条件判断 Switch Case
- 面试官教你写简历之『实习/应届生简历指南』(收藏)
- Java基础之线程原子量
- 最小生成树-Prim + Kruskal算法
- 仰睇天路,俯促鸣弦。神仪妩媚,举止详妍
- python爬取网络中的QQ号码
- 小赛毛游C记——初识C语言(3)
- 不存在R上的连续函数f,它在无理数集R\Q上是一一映射,而在有理数集Q上不是一一映 射。
- python导入openpyxl_python系列之(6)Python使用Openpyxl操作Excel
- 让物体沿椭圆轨道运动
- 如何使用Access创建一个简单MIS管理系统_Access
- MySQL-mysql安装步骤
- 澳大利亚公司称与中石油达成巨额售气协议