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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值