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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)