双数组Trie树中叶子结点check[t]=t的证明
双数组Trie树,其实就是用两个一维数组来表示Trie树这种数据结构。
一个数组称为BASE,另一个数组为CHECK。转移条件如下:
对于状态s,接收字符c,转移到状态t
BASE[s]+c=t
CHECK[t]=BASE[s]
- BASE数组保存结点的基地址
- CHECK数组标识结点的前驱信息
对于根结点,定义:
根结点的状态为0,\(t_根=0\)
根结点的基地址为1,放在BASE数组下标为0处保存,故\(BASE[t_根]=BASE[0]=1\)。
\(CHECK[t_根]=CHECK[0]=0\)
对于Trie树中的一个结点nodeA,有如下信息:
- 字符'A',这是给人看的
- 字符'A'的状态,用\(t_A\)来表示,\(t_A\)是一个整数。从根结点,经过条件 'A' 转移到nodeA,即:\(BASE[0]+code(A)=t_A=1+65=66\),其中code(A)一般为该字符的ASCII码。
- 字符'A'的基地址,使用BASE数组来保存
- 由于字符'A'对应的结点nodeA的前驱是根结点,即\(CHECK[t_A]=BASE[0]=1\)
对于叶子结点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中,是有序的)
双数组Trie树中叶子结点check[t]=t的证明的更多相关文章
- [转]双数组TRIE树原理
原文名称: An Efficient Digital Search Algorithm by Using a Double-Array Structure 作者: JUN-ICHI AOE 译文: 使 ...
- 双数组trie树的基本构造及简单优化
一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...
- 双数组Trie的一种实现
An Implementation of Double-Array Trie 双数组Trie的一种实现 原文:http://linux.thai.net/~thep/datrie/datrie.htm ...
- python Trie树和双数组TRIE树的实现. 拥有3个功能:插入,删除,给前缀智能找到所有能匹配的单词
#coding=utf- #字典嵌套牛逼,别人写的,这样每一层非常多的东西,搜索就快了,树高26.所以整体搜索一个不关多大的单词表 #还是O(). ''' Python 字典 setdefault() ...
- 双数组Trie树(DoubleArrayTrie)Java实现
http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...
- 双数组Trie树 (Double-array Trie) 及其应用
双数组Trie树(Double-array Trie, DAT)是由三个日本人提出的一种Trie树的高效实现 [1],兼顾了查询效率与空间存储.Ansj便是用DAT(虽然作者宣称是三数组Trie树,但 ...
- Ansj分词双数组Trie树实现与arrays.dic词典格式
http://www.hankcs.com/nlp/ansj-word-pairs-array-tire-tree-achieved-with-arrays-dic-dictionary-format ...
- 从Trie树到双数组Trie树
Trie树 原理 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,能在常数时间O(len)内实现插入和查 ...
- 双数组字典树(Double Array Trie)
参考文献 1.双数组字典树(DATrie)详解及实现 2.小白详解Trie树 3.论文<基于双数组Trie树算法的字典改进和实现> DAT的基本内容介绍这里就不展开说了,从Trie过来的同 ...
随机推荐
- linux中监控CPU、内存和磁盘状态的shell脚本。(centos7)
这篇博客中所写的脚本,在实际工作中并没有什么卵用,工作中并不会用到这种脚本去监控.不过自己写一遍,可以让初学者对CPU.内存.磁盘等一些基础知识和基础命令更加了解. 1.利用vmstat工具监控CPU ...
- IT人员必须掌握的10项软技能
现代企业的IT部门员工在具备技术能力的同时,还需要掌握一些软技能.现在来看这些软技能其实并不是什么新鲜事物,只是IT人员所需的这些软技能的范围与数量正在不断增加着. IT人员需要具备哪些技术能力,要取 ...
- 【BZOJ5294】[BJOI2018]二进制(线段树)
[BZOJ5294][BJOI2018]二进制(线段树) 题面 BZOJ 洛谷 题解 二进制串在模\(3\)意义下,每一位代表的余数显然是\(121212\)这样子交替出现的. 其实换种方法看,就是\ ...
- luogu5007 DDOSvoid 的疑惑 (树形dp)
我们来算每个点出现在的集合的个数 设f[i]为i出现的集合个数,g[i]是只选子树i 可以有多少种选法 那就有$g[i]=1+\prod\limits_{j是i的孩子}{g[j]} , f[i]=f[ ...
- hex文件格式
hex文件格式是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式有很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex. Hex文件格式解析 Hex文件如果用特殊的程 ...
- 【SPOJ116】Intervals
题目大意:有 N 个区间,在区间 [a, b] 中至少取任意互不相同的 c 个整数.求在满足 N 个区间约束的情况下,至少要取多少个正整数. 题解:差分约束系统模板题. 差分约束系统是对于 N 个变量 ...
- SQL问题+知识点总结总
1.SQL中的内置函数有哪些?(Count.Sum.Avg.Max.Min) 2.SQL查询语句的执行顺序.(先执行from语句,再执行条件语句,最后执行Select 语句投影查询信息) 3.Havi ...
- 在vue中使用import()来代替require.ensure()实现代码打包分离
最近看到一种router的写法 import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) const login = ...
- 苹果电脑利用wget总是会出现无法建立 SSL 连接的问题
在做迁徙学习的过程中,需要下载已经训练好的Inception_v3模型,首先我们为了将下载的模型保存到指定的地方,我们需要利用 wget -P 想要保存的目录 模型的网址,例如 wget -P /Vo ...
- poj 3273"Monthly Expense"(二分搜索+最小化最大值)
传送门 https://www.cnblogs.com/violet-acmer/p/9793209.html 题意: 有 N 天,第 i 天会有 a[ i ] 的花费: 将这 N 天分成 M 份,每 ...