双数组Trie树中叶子结点check[t]=t的证明
双数组Trie树,其实就是用两个一维数组来表示Trie树这种数据结构。
一个数组称为BASE,另一个数组为CHECK。转移条件如下:
对于状态s,接收字符c,转移到状态t
BASE[s]+c=t
CHECK[t]=BASE[s]
- BASE数组保存结点的基地址
- CHECK数组标识结点的前驱信息
对于根结点,定义:
根结点的状态为0,
根结点的基地址为1,放在BASE数组下标为0处保存,故。
对于Trie树中的一个结点nodeA,有如下信息:
- 字符'A',这是给人看的
- 字符'A'的状态,用来表示,是一个整数。从根结点,经过条件 'A' 转移到nodeA,即:,其中code(A)一般为该字符的ASCII码。
- 字符'A'的基地址,使用BASE数组来保存
- 由于字符'A'对应的结点nodeA的前驱是根结点,即
对于叶子结点node_leaf,定义该叶子结点的基地址为begin,code(node_leaf)=0,对于状态为t_leaf:
现在来证明:CHECK[t_leaf]=t_leaf
- BASE[begin+code(node_leaf)]=t_leaf 得到:BASE[begin]=t_leaf
- CHECK[t_leaf]=BASE[begin] 得到:CHECK[t_leaf]=t_leaf
其中,第1、2点就是由转移条件,证明完毕。
另外,在Hancks的这篇文章中,有如下引用:
3、然后将这群兄弟节点的check设为check[begin + a1…an] = begin;很显然,叶子节点i的check[i]的值一定等于i,因为它是兄弟节点中的第一个,并且它的code为0。
就好理解了。
另外,对于叶子结点而言,BASE[t_leaf]=-index,参考,其中 -index 表示:该叶子结点所代表的 关键词 在词典中顺序。(当构造双数组树时,词典先加载到TreeMap中,是有序的)
分类:
machine learning
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端