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(爆炸式字典树)解读相关推荐

  1. LeetCode Implement Trie (Prefix Tree)(字典树)

    问题:实现具有insert,search,startsWith方法的字典树 思路:就是要实现Trie数据结构 具体代码参考: https://github.com/wuli2496/OJ/tree/m ...

  2. php trie,数据结构-PHP 字典树(Trie)的实现

    ​这篇文章介绍一下字典树的实现原理,又称单词查找树.Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统 ...

  3. Trie(前缀树/字典树)及其应用

    from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...

  4. Trie树(字典树)详细知识点及其应用

    Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...

  5. 《恋上数据结构第1季》字典树 Trie

    字典树Trie Trie 简介 Trie 实现 接口设计 源码 测试 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java 基础推荐看这个: Java 强化笔记目录 Tri ...

  6. Java实现字典树 Trie

    Java实现字典树 Trie 一.字典树介绍 二.Trie实现以及基本的插入查询操作 数组实现: HashMap实现: Trie插入(这里都以数组实现为例): Trie查询: 三.相关例题: 1.le ...

  7. 数据结构之字典树Trie

    文章目录 Trie 字典树 前缀树 什么是Trie 基本概念 基本性质 应用场景 优点 手写一个trie Trie字典树的前缀查询 实现Trie(前缀树) LeetCode208 添加与搜索单词 - ...

  8. Trie树 -- 高效的字典树

    文章目录 简介 原理 构造一棵Trie树 使用Trie树进行查询 实现 模拟(瞎暴力)实现 空间优化 简介 Trie树是一种数据结构,它有一个好听的中文名字,叫"字典树".顾名思义 ...

  9. 字典树实现_leetcode之820. 单词的压缩编码 | python极简实现字典树

    题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell& ...

最新文章

  1. 云原生如此重要,可惜80%的人都不知道
  2. OSS控制台集成将数据库实时备份到OSS的功能
  3. liunx 上传 代码到github
  4. STM32之option bytes踩坑记录
  5. ARM指令寻址方式之: 数据处理指令的寻址方式
  6. GCC + pthread
  7. 连接mysql数据库小知识记录
  8. kettle中的switch_kettle 教程(三):条件判断 Switch Case
  9. 面试官教你写简历之『实习/应届生简历指南』(收藏)
  10. Java基础之线程原子量
  11. 最小生成树-Prim + Kruskal算法
  12. 仰睇天路,俯促鸣弦。神仪妩媚,举止详妍
  13. python爬取网络中的QQ号码
  14. 小赛毛游C记——初识C语言(3)
  15. 不存在R上的连续函数f,它在无理数集R\Q上是一一映射,而在有理数集Q上不是一一映 射。
  16. python导入openpyxl_python系列之(6)Python使用Openpyxl操作Excel
  17. 让物体沿椭圆轨道运动
  18. 如何使用Access创建一个简单MIS管理系统_Access
  19. MySQL-mysql安装步骤
  20. 澳大利亚公司称与中石油达成巨额售气协议

热门文章

  1. GLSL三种修饰符区别与用途(uniform,attribute和varying)
  2. C# 跨程序集调用常量、变量和函数
  3. ruby 安装和管理
  4. 如何修改Ubuntu Linux的时间
  5. FP-growth算法高效发现频繁项集
  6. gitblit无法安装windows服务或者启动服务失败:Failed creating java
  7. springMvc的一些简介 和基于xml的handlerMapping基本流程
  8. postman模拟post请求的四种请求体
  9. 安装icephp 记
  10. Mysql并发时经典常见的死锁原因及解决方法